Jagamisviis:


Koostöö JSON-iga Power Fx

Power Fx võimaldab koostajatel lugeda JSON into an Tüüpimata objektiks, kasutades ParseJSON funktsiooni.

Väärtuste lugemine ja teisendamine

ParseJSON teisendab järgmise JSON-kirjestringi väljadeks tüübita objekt ItemName Quantity ja ReleaseDate AvailableForPreOrder.

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

Igale väljale pääseb juurde punktimärgistuse abil Tüüpimata objekt väärtusel, mis on tagastatud failist 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 ) );

Üldiselt on hea idee tüübita objekt väärtuse selgesõnaliseks teisendamiseks konkreetseks tüübiks. Tüübita objekt seadmine muutuja väärtuseks muudab muutuja an tüübita objekt ka. Seega on tõenäoliselt vaja muutujale seadistamisel sellist väärtust selgesõnaliselt teisendada. Kuid enamikul juhtudel teisendatakse tüübita objekt väärtused automaatselt konkreetseks tüübiks ("sundimine"), kui neid kasutatakse funktsiooni parameetritena, kus tüüp on lihtne tüüp, nagu loogiline, arv või tekst, ja funktsiooni parameetriprofiilil pole potentsiaalseid vastuolulisi ülekoormusi.

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

Lisaks funktsioonikõnede tüübi automaatsele teisendamisele teisendatakse võimaluse korral ka kirjutamata objektid, kui need on määratud juhtimisomadustele.

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

Ja lõpuks, kui kasutate selliseid operaatoreid nagu &või +, sunnitakse an tüübita objekt , kui oodatava tüübi osas pole ebaselgust.

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

Märkus.

JSON-il pole tüüpi GUID, Color, Time ega DateTime . Need väärtused on esitatud stringina. Kui määrate kuupäeva sisaldava JSON tüübita objekt väärtuse otse tekstiatribuudile, kasutatakse JSON-i algteksti. See võib olla oluline ajavööndite, kuupäevavormingute jms käsitlemisel. Sellistel juhtudel peaksite väärtused selgesõnaliselt teisendama, kasutades funktsioone GUID(), ColorValue(), DateValue(), DateTimeValue()) jne.

Kui välja nimi koosneb kehtetust identifikaatori nimest, näiteks kui väljanimed algavad numbriga või sisaldavad kehtetuid märke, näiteks sidekriipsu, saate väljade nimed panna jutumärkidesse:

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

Power Fx ei hinda välja olemasolu enne, kui valem on käivitatud. See võimaldab sissetuleva JSON paindlikkust. Näiteks eelmine JSON võib mõnikord sisaldada lisavälja nimega Discount. Kuid meie eelmises näites seda välja ei ole. Valemi kirjutamine, mis kasutab välja Discount, ei põhjusta rakenduse loomise protsessis ega kasutajate rakenduse kasutamisel vigu. Kui väli valemi käitamisel puudub, annab väärtus lihtsalt väärtuse Tühi().

Märkus.

JSON toetab null väljade väärtusi. Nende tulemuseks on ka Tühi() väärtused. Praegu ei tee Power Fx'is vahet puuduval väljal või väljal, mille väärtus on null.

Kuna Tüüpimata objektide väljadele juurdepääsu ei hinnata valemi kirjutamisel, pole saadaval ka Intellisense'is. Nii JSON kui ka Power Fx on tõstutundlikud, seega olge väljade nimede kirjutamisel eriti ettevaatlik.

JSON-i väärtused ei pea olema kirje stiilis märkes. Kehtiv JSON võib olla lihtsalt väärtus, näiteks "text value", true või 123.456. Sellisel juhul on Tüüpimata objekt, mille ParseJSON tagastab, väärtus ise ja punktimärki ei kasutata.

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

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

Lõpuks toetab JSON pesastatud kirjeid. Sellise JSON teisendamine Tüüpimata objektiks annab tulemuseks pesastatud objektid ja punktimärki saab kasutada hierarhia läbimiseks.

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

Kui teisendate selle stringi JSON muutujaks Tüüpimata objekt nimega jsonObject, pääseb väljadele juurde punktimärgistuse abil.

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"

Kui punktitähistusavaldises mõnda välja pole olemas, tagastatakse Tühi().

Massiivid ja tabelid

JSON võib sisaldada väärtuste või kirjete massiive. Nendele massiividele pääseb juurde otse või saate need teisendada Power Fx tabeliteks.

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

See JSON sisaldab kirjet väljaga OrderLines, mis sisaldab kirjete massiivi. Igal kirjel on kaks välja: Item ja Quantity. Kui JSON teisendatakse Tüüpimata objekt kasutades ParseJSON funktsiooni ja määratakse muutujale nimega jsonOrder, pääseme üksikutele tellimuse ridadele juurde mitmel viisil.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Üksikuid kirjeid ja väärtusi saate hankida funktsiooni Register() abil. Näiteks teise kirje saamiseks väljal OrderLines, avage seejärel Quantity välja ja teisendage see väärtuseks.

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

Tellimisridade massiivi saate teisendada otse tabeliks. See loob ühe veeruga tabeli, milles kirjet esindab Tüüpimata objekt.

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

Ühe veeru tabelis „orderLines” on nüüd veerg „Väärtus”, mis esindab Tüüpimata objekti. Selle tabeli kirje mõne välja kasutamiseks kasutage punktimärki, et pääseda juurde konkreetsele JSON väljale Tüüpimata objektil jaotises Value veergu.

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

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

Tellimusrea kirjete kasutamise hõlbustamiseks ja lihtsamaks muutmiseks rakenduse muudes osades saate terve Tüüpimata objekti teisendada täielikult trükitud kirjeks, kasutades funktsiooni ForAll() funktsioon. Kui annate Tüüpimata objekti otse väljale ForAll(), saate objektiväljadele otse juurde pääseda, mitte kasutada üheveerulist välja Value.

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

Uus muutuja typedOrderLines on nüüd täielikult tüübitud Power Fx tabel järgmiste veergude ja väärtustega:

Üksus Kogus
„Vidin 1” 3
„Vidin 2” 5

Eelmistes näidetes kasutatakse kirjete massiive, kuid JSON võib sisaldada ka ainult väärtuste massiive. Vaatleme järgmist näidet, mis on kehtiv string JSON, mis sisaldab kolmest stringist koosnevat massiivi.

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

Funktsiooni Register() abil saame massiivist ühe üksuse tuua ja teisendada selle tekstiks.

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