Práca s JSON v Power Fx
Power Fx umožňuje tvorcom načítať JSON do Nezadaného objektu pomocou ParseJSON .
Čítanie a prevod hodnôt
ParseJSON skonvertuje nasledujúci JSON reťazec záznamu na netypový objekt s poľami ItemName
, Quantity
, ReleaseDate
a AvailableForPreOrder
.
{
"ItemName" : "Widget 1",
"Quantity" : 46,
"ReleaseDate" : "2022-09-01",
"AvailableForPreOrder" : true
}
Ku každému z polí je možné pristupovať pomocou bodkového zápisu na hodnote Netypový objekt vrátenej z ParseJSON.
Set( untyped, ParseJSON( jsonStringVariable ) );
Set( item, Text ( untyped.ItemName ) );
Set( quantity, Value ( untyped.Quantity ) );
Set( release, DateValue ( untyped.ReleaseDate ) );
Set( preorder, Boolean ( untyped.AvailableForPreOrder ) );
Vo všeobecnosti je dobré nápad explicitne previesť hodnotu netypový objekt na konkrétny typ. Nastavením netypový objekt ako hodnoty premennej sa premenná stane tiež netypový objekt . Preto je pravdepodobne potrebná explicitná konverzia takejto hodnoty pri nastavení na premennú. Vo väčšine prípadov sa však hodnoty netypový objekt konvertujú na konkrétny typ automaticky („vynútené“), keď sa použijú ako parametre funkcie, kde typ je jednoduchý typ, ako je booleovský, číslo alebo text, a profil parametrov funkcie nemá potenciálne konfliktné preťaženia.
Left( untyped.ItemName, 1 ); // "W"
Radians( untyped.Quantity ); // 0.80285146
If (untyped.AvailableForPreOrder, "Available", "Not Available" ); // "Available"
Okrem automatickej konverzie typu vo volaniach funkcií sa objekty bez typu skonvertujú aj pri priradení k vlastnostiam ovládacieho prvku, ak je to možné.
Label1.Text: untyped.Quantity
InputText1.Default: untyped.ItemName
A nakoniec, keď používate operátory ako napríklad & alebo +, an netypový objekt bude vynútené, ak neexistujú žiadne nejasnosti týkajúce sa očakávaného typu.
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
Poznámka
JSON nemá GUID, Farba, Čas alebo DátumČas . Tieto hodnoty sú reprezentované ako reťazec. Ak priradíte JSON netypový objekt hodnotu obsahujúcu dátum priamo k vlastnosti textu, pôvodný text JSON bude použité. To môže byť dôležité pri práci s časovými pásmami, formátmi dátumu atď. V takýchto prípadoch by ste mali explicitne previesť hodnoty pomocou GUID(), ColorValue(), DateValue(), DateTimeValue() atď.
V prípade, že názov poľa pozostáva z neplatného názvu identifikátora, napríklad ak názvy polí začínajú číslom alebo obsahujú neplatné znaky, ako je spojovník, môžete názvy polí vložiť do jednoduchých úvodzoviek:
untyped.'01'
untyped.'my-field'
Power Fx nevyhodnotí existenciu poľa, kým sa vzorec nespustí. To umožňuje flexibilitu v prichádzajúcom JSON. Napríklad predchádzajúci JSON môže niekedy obsahovať ďalšie pole s názvom Discount
. Ale v našom predchádzajúcom príklade toto pole nie je prítomné. Zápis vzorca, ktorý používa pole Discount
, nespôsobí žiadne chyby počas procesu vytvárania aplikácie ani pri používaní aplikácie používateľmi. Ak pole pri spustení vzorca chýba, výsledkom bude hodnota Blank().
Poznámka
JSON podporuje null
hodnoty pre polia. Výsledkom budú aj hodnoty Blank(). V súčasnosti neexistuje rozdiel Power Fx medzi chýbajúcim poľom alebo poľom, ktoré má hodnotu null
.
Keďže sa pri písaní vzorca nevyhodnocuje prístup k poliam Netypové objekty, nie je k dispozícii ani Intellisense. JSON a Power Fx rozlišujú malé a veľké písmená, takže pri písaní názvov polí buďte obzvlášť opatrní.
Hodnoty JSON nemusia byť v zápise v štýle záznamu. Platná JSON môže byť len hodnota, ako napríklad "text value"
, true
alebo 123.456
. V takom prípade Netypový objekt, ktorý vracia ParseJSON, je samotná hodnota a bodový zápis nie je použitý.
Set( myText, Boolean( ParseJSON( "true" ) ) );
Set( myNumber, Value( ParseJSON( "123.456" ) ) );
Nakoniec, JSON podporuje vnorené záznamy. Výsledkom konverzie takéhoto JSON do netypového objektu sú vnorené objekty a bodkový zápis možno použiť na prechádzanie hierarchiou.
{
"Version" : 1,
"RootElement" : {
"Parent" : {
"Name" : "This is the parent",
"Child" : {
"Name" : "This is the child"
}
}
}
}
Pri konverzii tohto reťazca na JSON na premennú netypového objektu s názvom jsonObject
môžu polia byť prístupné pomocou bodového zápisu.
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"
Ak niektoré z polí vo výraze bodového zápisu neexistuje, vráti sa Blank().
Polia a tabuľky
JSON môže obsahovať polia hodnôt alebo záznamov. K týmto poliam je možné pristupovať priamo alebo ich konvertovať na tabuľky Power Fx.
{
"OrderNumber" : "SO000010",
"CustomerID" : "CUST0126",
"OrderLines" : [
{
"Item" : "Widget 1",
"Quantity" : 3
},
{
"Item" : "Widget 2",
"Quantity" : 5
}
]
}
Tento JSON obsahuje záznam s poľom s názvom OrderLines
, ktorý obsahuje pole záznamov. Každý záznam má dve polia: Item
a Quantity
. Ak sa JSON skonvertuje na Netypový objekt pomocou funkcie ParseJSON a nastavená na premennú s názvom jsonOrder
, môžeme pristupovať k jednotlivým riadkom objednávky viacerými spôsobmi.
Set( jsonOrder, ParseJSON( jsonStringVariable ) );
Jednotlivé záznamy a hodnoty môžete získať pomocou funkcie Index(). Ak chcete napríklad získať druhý záznam v poli OrderLines
, prejdite do poľa Quantity
a skonvertujte ho na hodnotu.
Set( line2Quantity, Value( Index( jsonOrder.OrderLines, 2 ).Quantity ); // 5
Pole riadkov objednávok môžete previesť priamo na tabuľku. Tým sa vytvorí jednostĺpcová tabuľka s netypovým objektom reprezentujúcim záznam.
Set( orderLines, Table( jsonOrder.OrderLines ) );
Jednostĺpcová tabuľka „orderLines“ má teraz stĺpec „Hodnota“, ktorý predstavuje Netypový objekt. Ak chcete použiť ktorékoľvek z polí zo záznamu v tejto tabuľke, použite bodový zápis na prístup ku konkrétnemu poľu JSON v netypovom objekte v stĺpci Value
.
Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table
Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"
Ak chcete zjednodušiť a zjednodušiť používanie záznamov riadku objednávky v iných častiach vašej aplikácie, môžete previesť celý Netypový objekt na úplne zadaný záznam pomocou funkcie ForAll(). Ak netypový objekt priamo poskytnete na ForAll(), znamená to, že môžete pristupovať priamo k poliam objektu namiesto použitia jednostĺpcového poľa Value
.
Set( typedOrderLines, ForAll( jsonOrder.OrderLines, { Item : Text( ThisRecord.Item ), Quantity : Value( ThisRecord.Quantity ) } ) );
Nová premenná typedOrderLines
je teraz plne typizovaná tabuľka Power Fx s nasledujúcimi stĺpcami a hodnotami:
Položka | Množstvo |
---|---|
"Miniaplikácia 1" | 3 |
"Miniaplikácia 2" | 5 |
Predchádzajúce príklady používajú polia záznamov, ale JSON môže obsahovať aj polia iba hodnôt. Uvažujme o nasledujúcom príklade, ktorý je platným reťazcom JSON obsahujúcim pole troch reťazcov.
[ "First Item", "Second Item", "Third Item"]
Pomocou funkcie Index() môžeme získať jednu z položiek z poľa a previesť ju na text.
Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"