Bendrinti naudojant


Darbas su JSON Power Fx

„Power Fx“ leidžia kūrėjams skaityti JSON į neapibrėžto tipo objektą naudojant „ParseJSON“ funkciją.

Reikšmių skaitymas ir konvertavimas

„ParseJSON“ konvertuos šią „JSON“ įrašo eilutę į Neapibrėžto tipo objektą su laukais ItemName, Quantity, ReleaseDate ir AvailableForPreOrder.

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

Kiekvieną lauką galima pasiekti naudojant taškų žymą Neapibrėžto tipo objekto reikšmei, grąžintai iš „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 ) );

Paprastai yra gera idėja aiškiai konvertuoti neapibrėžto tipo objektas vertę į konkretų tipą. Nustačius neapibrėžto tipo objektas kaip kintamąją reikšmę, kintamasis tampa an neapibrėžto tipo objektas taip pat. Taigi, tikėtina, kad tokią vertę reikia aiškiai konvertuoti, kai nustatoma į kintamąjį. Tačiau daugeliu atvejų neapibrėžto tipo objektas reikšmės bus automatiškai konvertuojamos į konkretų tipą ("prievarta"), kai naudojamos kaip funkcijos parametrai, kai tipas yra paprastas tipas, pvz., Bulio logikos, skaičius ar tekstas, o funkcijos parametrų profilyje nėra galimų prieštaringų perkrovų.

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

Be automatinio tipo konvertavimo funkcijų iškvietimuose, neįvesti objektai taip pat bus konvertuojami, kai bus priskirti valdymo ypatybėms, jei įmanoma.

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

Ir galiausiai, naudojant tokius operatorius kaip & arba +, neapibrėžto tipo objektas bus prievarta, jei nebus dviprasmybių dėl numatomo tipo.

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

Pastaba.

JSON neturi GUID, Color, Time arba DateTime tipo. Šios vertės pateikiamos kaip eilutė. Jei teksto ypatybei tiesiogiai priskirsite JSON neapibrėžto tipo objektas reikšmę, kurioje yra data, bus naudojamas pradinis JSON tekstas . Tai gali būti svarbu dirbant su laiko juostomis, datos formatais ir kt. Tokiais atvejais turėtumėte aiškiai konvertuoti reikšmes naudodami GUID(), ColorValue(), DateValue(), DateTimeValue()ir kt.

Jei lauko pavadinimą sudaro netinkamas identifikatoriaus pavadinimas, pvz., kai laukų pavadinimai prasideda skaičiumi arba yra netinkamų simbolių, pvz., brūkšnelis, laukų pavadinimus galite rašyti viengubose kabutėse:

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

„Power Fx“ lauko neįvertins, kol bus vykdoma formulė. Tai suteikia galimybę lanksčiai naudoti gaunamą JSON. Pavyzdžiui, ankstesniame „JSON“ kartais gali būti papildomas laukas, vadinamas Discount. Bet mūsų ankstesniame pavyzdyje šio lauko nėra. Rašant formulę, kurioje naudojamas Discount laukas, programos kūrimo proceso metu arba vartotojams naudojant programą nebus jokių klaidų. Jei lauko nėra, kai paleidžiama formulė, reikšmė bus Blank().

Pastaba.

„JSON“ palaiko null laukų reikšmes. Dėl to taip pat bus gaunamos Blank() reikšmės. Šiuo metu „Power Fx“ nėra skirtumo tarp trūkstamo lauko ar lauko, kuris turi reikšmę null.

Kadangi rašant formulę prieiga prie laukų Neapibrėžto tipo objektuose nėra įvertinta, taip pat nėra prieinamos „Intellisense“ . Tiek „JSON“, tiek „Power Fx“ yra slapti atvejai, todėl būkite atsargūs rašydami laukų pavadinimus.

„JSON“ reikšmių nereikia įrašyti kaip įrašo stiliaus notacijos. Tinkamas „JSON“ gali būti tik reikšmė, pvz., "text value", true arba 123.456. Tokiu atveju Neapibrėžto tipo objektas, kurį grąžina „ParseJSON“, yra pati reikšmė, o taškų notacija nenaudojama.

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

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

Galiausiai „JSON“ palaiko įdėtus įrašus. Konvertuojant tokį „JSON“ į Neapibrėžto tipo objektą gaunami įdėti objektai, o tašką galima naudoti hierarchijai apeiti.

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

Konvertuojant šią „JSON“ eilutę į Neapibrėžto tipo objekto pavadintą kintamąjį jsonObject, laukus galima pasiekti naudojant taškinę notacija.

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"

Jei kurių nors taškų notacijos išraiškos laukų nėra, bus pateikta Blank().

Masyvai ir lentelės

„JSON“ gali būti reikšmių ar įrašų masyvų. Šiuos masyvus galima pasiekti tiesiogiai arba konvertuoti į „Power Fx“ lenteles.

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

Šiame „JSON“ yra įrašas su lauku, pavadintu OrderLines, kuriame yra įrašų masyvas. Kiekvienas įrašas turi du laukus: Item ir Quantity. Jei „JSON“ konvertuojamas į Neapibrėžto tipo objektą naudojant „ParseJSON“ funkciją ir yra nustatytas į kintamąjį pavadinimu jsonOrder, individualias užsakymo eilutes galime pasiekti keliais būdais.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Naudodami funkciją Index() galite nuskaityti atskirus įrašus ir reikšmes. Pavyzdžiui, jei norite gauti antrą lauko OrderLines įrašą, prisijunkite prie lauko Quantity ir konvertuokite jį į reikšmę.

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

Užsakymo eilučių masyvą galite konvertuoti tiesiai į lentelę. Taip sukursite vieno stulpelio lentelę su Neapibrėžto tipo objektu, nurodančiu įrašą.

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

Dabar viename stulpelyje esančioje lentelėje „orderLines“ yra stulpelis „Reikšmė“, kuriame pateikiamas Neapibrėžto tipo objektas. Jei norite naudoti bet kurį šios lentelės įrašo lauką, naudokite taškinę notaciją konkrečiam „JSON“ laukui pasiekti Neapibrėžto tipo objekto stulpelyje Value.

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

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

Jei norite, kad užsakymo eilučių įrašus būtų lengviau ir paprasčiau naudoti kitose programos dalyse, galite konvertuoti visą Neapibrėžto tipo objektą į visiškai įvestą įrašą naudodami ForAll() funkciją. Teikiant Neapibrėžto tipo objektą tiesiogiai į ForAll(), galėsite pasiekti objektų laukus tiesiogiai, o ne naudoti vieno stulpelio Value lauką.

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

Naujasis typedOrderLines kintamasis dabar yra visiškai užpildyta „Power Fx“ lentelė su šiais stulpeliais ir reikšmėmis:

Elementas Kiekis
1 grafinės sąsajos elementas 3
2 grafinės sąsajos elementas 5

Ankstesniuose pavyzdžiuose naudojami įrašų masyvai, tačiau „JSON“ gali būti tik reikšmių masyvų. Panagrinėkime šį pavyzdį, kuris yra galiojanti „JSON“ eilutė, kurioje yra trijų eilučių masyvas.

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

Vieną iš masyvo elementų galime gauti naudodami funkciją Index() ir konvertuodami jį į tekstą.

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