Jaa


JSON:ien käyttö Power Fx:ssä

Power Fx sallii tekijöiden lukea JSON:n tyypittämättömään objektiin käyttämällä ParseJSON-funktiota.

Arvojen lukeminen ja muuntaminen

ParseJSON muuntaa seuraavan JSON tyypittämätön objekti tietuemerkkijonon ankentiksi ItemName, Quantity ReleaseDate ja AvailableForPreOrder.

{
  "ItemName" : "Widget 1",
  "Quantity" : 46,
  "ReleaseDate" : "2022-09-01",
  "AvailableForPreOrder" : true
}

Kaikkia näitä kenttiä voidaan käyttää pistenotaatiolla ParseJSON-funktion palauttamassa tyypittämättömän objektin arvossa.

Set( untyped, ParseJSON( jsonStringVariable ) );

Set( item, Text ( untyped.ItemName ) );
Set( quantity, Value ( untyped.Quantity ) );
Set( release, DateValue ( untyped.ReleaseDate ) );
Set( preorder, Boolean ( untyped.AvailableForPreOrder ) );

On yleensä hyvä muuntaa tyypittämättömän objektin arvo eksplisiittisesti tietyksi tyypiksi. Jos muuttujan arvoksi määritetään tyypittämätön objekti, muuttujasta tulee myös tyypittämätön objekti. Niinpä tällaisen arvon muuntaminen eksplisiittisesti on todennäköisesti tarpeen muuttujaan määritettäessä. Useimmissa tapauksissa tyypittämättömän objektin arvot muunnetaan kuitenkin automaattisesti tiettyyn tyyppiin, kun niitä käytetään funktion parametreina, joissa tyyppi on yksinkertainen tyyppi, kuten totuusarvo, numero tai teksti, ja toiminnon parametriprofiililla ei ole potentiaalisia ristiriitaisia ylikuormituksia.

Left( untyped.ItemName, 1 ); // "W"
Radians( untyped.Quantity ); // 0.80285146
If (untyped.AvailableForPreOrder, "Available", "Not Available" ); // "Available"

Funktiokutsujen tyypin muuntamisen lisäksi tyypittämättömät objektit muunnetaan myös, jos mahdollista, kun ne määritetään ohjausobjektin ominaisuuksiin.

Label1.Text: untyped.Quantity
InputText1.Default: untyped.ItemName

Ja kun käytät operaattoreita, kuten & tai +, tyypittämätön objekti pakotetaan, jos odotetusta tyypistä ei ole epäselvyyttä.

untyped.Quantity + 1 // result is a number
untyped.ItemName & " (preorder)" // result is text
untyped.Quantity + untyped.Quantity // result is a number
untyped.Quantity & untyped.ItemName // result is text

Muistiinpano

JSONilla ei ole GUID- , Color- , Time - tai DateTime-tyyppiä . Nämä arvot esitetään merkkijonoina. Jos määrität tekstiominaisuudelle suoraan päivämäärän sisältävän tyypittämättömän objektin JSON-arvon, käytetään JSON-arvon alkuperäistä tekstiä. Tämä voi olla tärkeää käsiteltäessä aikavyöhykkeitä, päivämäärämuotoja ja niin edelleen. Tällöin arvot on muunnettava eksplisiittisesti käyttämällä funktioita GUID(), ColorValue(), DateValue(), DateTimeValue() jne.

Jos kentän nimi sisältää virheellisen tunnistenimen, esimerkiksi silloin, kun kenttien nimien alussa on numero tai jos siinä on virheellisiä merkkejä, kuten tavuviivaa, voit lisätä kenttien nimet yksinkertaisiin lainausmerkkeihin:

untyped.'01'
untyped.'my-field'

Power Fx arvioi kentän olemassaolon vasta, kun kaava suoritetaan. Näin saapuva JSON on joustava. Esimerkiksi aiempi JSON voi joskus sisältää ylimääräisen kentän nimeltään Discount. Tätä kenttää ei kuitenkaan ole olemassa edellisessä esimerkissämme. Discount-kenttää käyttävän kaavan kirjoittaminen ei johda virheisiin sovelluksen luonnin aikana tai kun käyttäjät käyttävät sovellusta. Jos kenttä puuttuu, kun kaava suoritetaan, arvo johtaa vain Blank()-arvoon.

Muistiinpano

JSON tukee null kenttien arvoja. Myös ne johtavat Blank()-arvoihin. Tällä hetkellä Power Fx:ssä ei erotella puuttuvaa kenttää tai kenttää, jolla on null-arvo.

Koska tyypittämättömien objektien kenttien käyttämistä ei arvioida kaavaa kirjoitettaessa, Intellisense ei myöskään ole käytettävissä. Sekä JSON että Power Fx ovat merkkikokoriippuvaisia, joten kirjoita kenttien nimet huolellisesti.

JSON-arvojen ei tarvitse olla tietuetyylisiä. Kelvollinen JSON voi olla pelkkä arvo, kuten "text value", true tai 123.456. Tällöin ParseJSON-funktion palauttama tyypittämätön objekti on itsessään arvo eikä pistenotaatiota käytetä.

Set( myText, Boolean( ParseJSON( "true" ) ) );

Set( myNumber, Value( ParseJSON( "123.456" ) ) );

JSON tukee myös sisäkkäisiä tietueita. Tällaisen JSON:n muuntaminen tyypittämättömäksi objektiksi johtaa sisäkkäisiin objekteihin, ja hierarkiaa voidaan selata pistenotaatiolla.

{
  "Version" : 1,
  "RootElement" : {
    "Parent" : {
      "Name" : "This is the parent",
      "Child" : {
        "Name" : "This is the child"
      }
    }
  }
}

Kun tämä JSON-merkkijono muunnetaan tyypittämättömän objektin muuttujaksi nimeltään jsonObject, kenttiä voidaan käyttää pistenotaatiolla.

Set( jsonObject, ParseJSON( jsonStringVariable ) );

Set( parentName, Text( jsonObject.RootElement.Parent.Name ) ); // "This is the parent"

Set( childName, Text( jsonObject.RootElement.Parent.Child.Name ) ); // "This is the child"

Jos mitään pistenotaation lausekkeen sisältämiä kenttiä ei ole olemassa, Blank() palautetaan.

Matriisit ja taulukot

JSON voi sisältää arvo- tai tietuetaulukoita. Näitä matriiseja voidaan käyttää suoraan tai ne voidaan muuntaa Power Fx -taulukoiksi.

{
  "OrderNumber" : "SO000010",
  "CustomerID" : "CUST0126",
  "OrderLines" : [
    {
      "Item" : "Widget 1",
      "Quantity" : 3
    },
    {
      "Item" : "Widget 2",
      "Quantity" : 5
    }
  ]
}

Tämä JSON sisältää tietueen, jonka OrderLines-kenttä sisältää tietueiden matriisin. Jokaisella tietueella on kaksi kenttää: Item ja Quantity. Jos JSON muunnetaan tyypittämättömäksi objektiksi käyttämällä ParseJSON-funktiota ja määritetään muuttujaan nimeltään jsonOrder, voimme käyttää yksittäisiä tilausrivejä monin eri tavoin.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Voit noutaa yksittäisiä tietueita ja arvoja käyttämällä funktiota Index(). Jos haluat noutaa esimerkiksi toisen tietueen OrderLines-kentästä, käytä Quantity-kenttää ja muunna se arvoksi.

Set( line2Quantity, Value( Index( jsonOrder.OrderLines, 2 ).Quantity ); // 5

Voit muuntaa tilausrivien matriisin suoraan taulukoksi. Tämä luo yksisarakkeisen taulukon, jossa tyypittämätön objekti edustaa tietuetta.

Set( orderLines, Table( jsonOrder.OrderLines ) );

Yksisarakkeisella 'orderLines'-taulukolla on nyt 'Value'-sarake, joka edustaa tyypittämätöntä objektia. Jos haluat käyttää mitä tahansa tämän taulukon tietueen kenttää, käytä pistenotaatiota käyttääksesi Value -sarakkeessa olevan tyypittämättömän objektin JSON-kenttää.

Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table

Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"

Voit tehdä tilausrivitietueiden käytöstä helpompaa ja suoraviivaisempaa sovelluksesi muissa osissa muuntamalla koko tyypittämättömän objektin täysin tyypitetyksi tietueeksi ForAll()-funktiolla. Tyypittämättömän objektin antaminen suoraan kohteelle ForAll() tarkoittaa, että voit käyttää objektin kenttiä suoraan käyttämättä yksisarakkeista Value-kenttää.

Set( typedOrderLines, ForAll( jsonOrder.OrderLines, { Item : Text( ThisRecord.Item ), Quantity : Value( ThisRecord.Quantity ) } ) );

Uusi typedOrderLines-muuttuja on nyt täysin tyypitetty Power Fx -taulukko, joka sisältää seuraavat sarakkeet ja arvot:

Kohde Määrä
"Pienoissovellus 1" 3
"Pienoissovellus 2" 5

Aiemmissa esimerkeissä käytetään tietueiden matriiseja, mutta JSON voi sisältää myös pelkkien arvojen matriiseja. Huomioi seuraava esimerkki, joka on käypä kolmen merkkijonon matriisin sisältävä JSON-merkkijono.

[ "First Item", "Second Item", "Third Item"]

Voimme noutaa yhden matriisin kohteista käyttämällä Index()-funktiota ja muuntaa sen tekstiksi.

Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"