Jaa


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

Power Fx:n avulla tekijät voivat lukea JSON-kohteendynaamiseksi arvoksiParseJSON-funktion avulla.

Arvojen lukeminen ja muuntaminen

ParseJSON muuntaa seuraavan JSON-tietuemerkkijonon dynaamiseksi tietueeksi, jossa on kentät , ItemNameQuantityReleaseDate ja .AvailableForPreOrder

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

Kutakin kenttää voi käyttää käyttämällä ParseJSON-funktiosta palautetun dynaamisen arvon pistemerkintää.

Set( dynvalue, ParseJSON( jsonStringVariable ) );

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

Dynaamisen arvon eksplisiittinen muuntaminen tietyksi tyypiksi on yleensä hyvä idea. Dynaamisen arvon määrittäminen muuttujan arvoksi tekee myös muuttujasta dynaamisen arvon. Niinpä tällaisen arvon muuntaminen eksplisiittisesti on todennäköisesti tarpeen muuttujaan määritettäessä. Useimmissa tapauksissa dynaamiset arvot muunnetaan kuitenkin tietyksi tyypiksi automaattisesti ("pakota"), kun sitä käytetään funktioparametreina, jolloin tyyppi on yksinkertainen tyyppi, kuten totuusarvo, luku tai teksti, eikä funktion parametriprofiililla ole mahdollisia ristiriitaisia ylikuormituksia.

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

Sen lisäksi, että dynaaminen arvo muunnetaan automaattisesti funktiokutsuissa, myös dynaamiset arvot muunnetaan mahdollisuuksien mukaan, kun niitä määritetään ohjausobjektin ominaisuuksiin.

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

Lisäksi käytettäessä operaattoreita , kuten & tai +, dynaaminen arvo pakotetaan, jos odotetulla tyypillä ei ole moniselitteisyyttä.

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

Muistiinpano

JSONilla ei ole GUID- , Color- , Time - tai DateTime-tyyppiä . Nämä arvot esitetään merkkijonoina. Jos määrität päivämäärän sisältävän JSON-arvon suoraan teksti-ominaisuuteen, JSON :n alkuperäistä tekstiä käytetään. 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:

dynamic.'01'
dynamic.'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 dynaamisen arvon kenttien käyttöä ei arvioida kaavaa kirjoitettaessa, Intellisense ei ole myöskään 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ässä tapauksessa ParseJSON-funktion palauttama dynaaminen arvo on itse arvo, eikä pistemerkintää käytetä.

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

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

JSON tukee myös sisäkkäisiä tietueita. Tällaisen JSON-muunnon muuntaminen dynaamiseksi arvoksi johtaa sisäkkäisiin objekteihin, ja pistemerkintää voidaan käyttää hierarkian läpikulkuun.

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

Kun muunnat tämän JSON-merkkijonondynaamiseksi muuttujaksi nimeltä jsonObject, kenttiä voidaan käyttää käyttämällä pistemerkintää.

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 dynaamiseksi arvoksi ParseJSON-funktiolla ja asetetaan muuttujaksi nimeltä jsonOrder, voimme käyttää yksittäisiä tilausrivejä useilla tavoilla.

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 on tietuetta edustava dynaaminen arvo.

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

Yksisarakkeisessa taulukossa OrderLines on nyt Value-sarake, joka edustaa dynaamista arvoa. Jos haluat käyttää mitään tämän taulukon tietueen kenttiä, käytä pistemerkintää, kun haluat käyttää tiettyä JSON-kenttää sarakkeen Value arvossa.

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

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

Jotta tilausrivin tietueiden käyttö olisi helpompaa ja suoraviivaisempaa sovelluksen muissa osissa, voit muuntaa koko Dynaamisen arvon kokonaan kirjoitetuksi tietueeksi ForAll() -funktiolla. Jos annat dynaamisen arvon suoraan ForAll() -funktiolle, voit käyttää objektikenttiä suoraan yhden sarakkeen Value kentän käyttämisen sijaan.

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"