Viime viikolla esiteltiin Power Appsin ParseJSON -funktio. Osa Power Apps -tekijöistä hurrasi koko viikon. Valtaosa lähinnä ihmetteli, mistä tässä on kyse.
Tällä kertaa käydään läpi, mitä (canvas) Power Appsiin ilmestynyt Parse JSON -funktio tekee ja mihin sitä voi käytännössä hyödyntää.
Mikä ihmeen ParseJSON?
Power Platformissa ratkaisuja rakennetaan yhdistimien (connector) avulla. Haetaan esimerkiksi flown List rows -toiminnolla kaikki asiakkaat (Accounts).

Toiminto palauttaa Dataversestä asiakkaiden kaikki tiedot JSON-muodossa.

Useimmiten voimme unohtaa tämän JSON:in kokonaan, sillä asiakkaan tietoja (nimi, osoite jne) voi käyttää flow’ssa suoraan.

Tämä on mahdollista, sillä alusta parsii automaattisesti JSON-merkkijonon käyttöömme.
Tilanne on toinen kun teemme omia rajapintakutsuja. Tällöin toiminto palauttaa rajapinnan paluuarvon (body). Joka useimmiten on JSON-muodossa.

Mikäli haluamme käyttää paluuarvoja tuttuun tapaan, tulee meidän parsia JSON:in sisältö itse. Tämä tehdään Parse JSON -toiminnolla, jossa kuvataan JSON:in rakenne (Schema) tietotyyppeineen.

Tämä kaikki on onnistunut flow’ssa aikojen alusta asti. Mutta Power Appsissa tätä ei ole voinut (helposti) tehdä.
Mitä tämä on käytännnössä tarkoittanut?
Jos Power Apps lukee esimerkiksi SharePoint-listalta rivin, jonka yhdessä sarakkeessa on JSON-muotoista sisältöä, ei tätä saraketta ole voinut juurikaan hyödyntää. Power Appsin näkökulmasta se on vain tekstiä, eikä se riitä. Teksti pitäisi jollain ihmeellä muuttaa objektiksi.
Mutta nyt kaikki on toisin!
Katsotaan muutama esimerkki, mitä tällä uudella ParseJSON-funktiolla voi käytännössä tehdä.
Esimerkki – Tilausrivit
Hahmotellaan yksinkertaista tilaussovellusta. Yksi tilaus voi sisältää useita tuotteita. Koko tilaus tuotteineen tallennetaan yhdelle SharePoint -listan riville. Listan yksi sarake (Order rows in JSON format) sisältää tilatut tuotteet JSON-muodossa.
Tilausrivit:

Yhden tilauksen sisältö:

Esitetään tilausrivit Power Appsin galleriassa. Tilauksen sisältämät tuotteet ovat rivillä JSON-muodossa, mutta Power Appsin näkökulmasta sisältö on vain tekstiä. Emme esimerkiksi voi esittää tilauksen sisältöä omassa galleriassaan.

Paitsi että nyt voimme.
Luodaan galleria, jonka arvoksi (items) asetetaan parsittu tilausrivikenttä (order rows in JSON format) taulukossa. Ei toimi aivan vielä.

Koodi
Table(ParseJSON(Gallery1.Selected.'Order rows in JSON format'))
Palauttaa taulukon, jossa kyllä on oikeat rivit (3kpl tietueita JSON-sisällöstä). Mutta meidän tulee vielä poimia halutut kentät näkyville. Samalla määritellään niiden tietotyyyppit (Text, Value jne. -funktioilla).
Helpoimmalla pääsee lisäämällä taulukkoon uusi sarake kutakin kenttää kohden.
AddColumns(
Table(ParseJSON(Gallery1.Selected.'Order rows in JSON format')),
"item", Text(ThisRecord.Value.item),
"qty", Value(ThisRecord.Value.qty),
"unitprice", Value(ThisRecord.Value.unitprice),
"totalprice", Value(ThisRecord.Value.totalprice),
"comments",b Text(ThisRecord.Value.comments)
)
Kas näin!

Nyt voimme esittää valitun tilauksen tuotteet omassa galleriassaan.

Voisimme tehdä sovelluksen, jossa
- käyttäjä luo tilauksia
- jokaiselle tilaukselle poimitaan mukaan 0-n tuotteita
- tilaus tallennetaan kokonaisuudessaan yhdelle SharePoint-listan riville
- tilauksia voi selata ja muokata jälkikäteen
Aina ei toki kannata tehdä jotain, vaikka se olisi mahdollista.
Tällaisessa toteutuksessa meidän on vaikeaa
- laskea montako tuotetta tilaukset sisältävät
- hakea tuotteita tilauksien sisältä
- päivittää tilausten rivejä massana
- jne
Mutta samaa konseptia voi käyttää johonkin järkevämpään. Tallennetaan esimerkiksi Azure Blobiin varmuuskopiot päivän tilauksista JSON-muodossa. ParseJSON-toimintoa hyödyntäen voi rakentaa Power Appsin, jolla näitä Blobiin luotuja varmuuskopioita voi selailla luettavassa muodossa.
Esimerkki 2 – Tietojen palauttaminen flow’sta Power Appsiin
Power Appsista voi käynnistää flow’n, joka hakee tietoja ja palauttaa ne Power Appsille.
Alla Power Appsista käynnistyvä flow, joka hakee ympäristön sovellukset ja palauttaa ne tietoineen kutsuvalle Power Appsille. Koska paluusanoma sisältää JSON:in lisäksi myös sen rakenteen kuvauksen (schema), voi tulosjoukkoa hyödyntää sellaisenaan esimerkiksi gallerian arvona.

Mutta… Response-toiminto on premiumia ja se edellyttää sovelluksen käyttäjältä Power Apps -lisenssiä. Tämä on ongelma, mikäli kaikki muu ratkaisussa toimii standard -toiminnoin (ei edellytä Power Apps -lisenssiä).
Enää emme tarvitse Response-toimintoa. Voimme palauttaa tiedot tekstimuodossa vakiotoiminnolla (Respond to a PowerApp or flow).

Joudumme luonnollisesti parsimaan paluuarvona saadun (JSON-muotoisen) tekstin itse. Esimerkiksi näin:
- Tallennetaan varAppsJSONText-muuttujaan flow’n paluuarvo (returnValue, JSON-muotoinen merkkijono)
- Luodaan varAppsJSONText-muuttujasta ParseJSON ja AddColumns -toimintojen arvolla taulukko, joka sisältää Power Appsin nimen (Name) ja tyypin (AppType)

Huomaa, että voimme navigoida JSON-rakenteessa. Sovelluksen nimi löytyy JSON:in sisällä olevasta properties-tietueesta.
Text(ThisRecord.Value.properties.displayName)
Muodostettua taulukkoa voi käyttää normaaliin tapaan galleriassa.

Yhteenveto
Power Appsin ParseJSON on varsin kätevä komento. Mutta kuten esimerkeistä näimme, kansalaiskehittäjät sitä tuskin aivan heti tarvitsevat.
Toiminto on vasta kokeellisessa (experimental) vaiheessa. Se todennäköisesti tulee vielä muuttumaan. Älä siis käytä oikeissa ratkaisuissasi. Vielä.