Rad sa JSON-om u Power Fx

Power Fx omogućava autorima da učitaju JSON u netipizirani objekat pomoću funkcije ParseJSON.

Čitanje i konvertovanje vrednosti

ParseJSON će pretvoriti sledeći JSON niz zapisa u netipizirani objekat sa poljima ItemName, Quantity, ReleaseDate i AvailableForPreOrder.

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

Svakom polju se može pristupiti pomoću tačkaste notacije o vrednosti netipiziranog objekta koja se vraća iz funkcije 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 ) );

Generalno je dobra ideja da eksplicitno konvertujete vrednost netipizirani objekat u određeni tip. Podešavanje netipizirani objekat kao promenljive vrednosti čini promenljivu netipizirani objekat takođe. Dakle, verovatno je potrebno pretvaranje takve vrednosti eksplicitno prilikom podešavanja na promenljivu. Ali u većini slučajeva netipizirani objekat vrednosti će se automatski pretvoriti u određeni tip ("prinuda") kada se koriste kao parametri funkcije gde je tip jednostavan tip kao što je boolean, broj ili tekst, a profil parametara funkcije nema potencijalna konfliktna preopterećenja.

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

Pored automatskog pretvaranja tipa u funkcijskim pozivima, neotkucani objekti će takođe biti konvertovani kada su dodeljeni kontrolnim svojstvima, gde je to moguće.

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

I na kraju, kada se koriste operatori kao što su & ili +, netipizirani objekat će biti primoran ako ne postoji dvosmislenost o očekivanom tipu.

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

Belešku

JSON nema tip GUID, Color, Time ili DateTime . Ove vrednosti su predstavljene kao string. Ako dodelite JSONnetipizirani objekat vrednost koja sadrži datum direktno tekstualnoj osobini, originalni tekst JSON-a će se koristiti. Ovo može biti važno kada se radi o vremenskim zonama, formatima datuma itd. U takvim slučajevima treba eksplicitno konvertovati vrednosti koristeći GUID(), ColorValue(), DateValue(), DateTimeValue(), itd.

U slučaju da se ime polja sastoji od nevažećeg imena identifikatora, na primer, kada imena polja počinju brojem ili sadrže nevažeće znakove kao što je crtica, imena polja možete da stavite u jednostruke navodnike:

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

Power Fx neće procenjivati postojanje polja dok se formula ne pokrene. To omogućava fleksibilnost za dolazeći JSON. Na primer, prethodni JSON ponekad može da sadrži dodatno polje koje se zove Discount. Ali u našem prethodnom primeru, ovo polje nije prisutno. Pisanje formule koja koristi polje Discount neće dovesti do grešaka, tokom procesa pravljenja aplikacija ili kada korisnici koriste aplikaciju. Ako polje nedostaje kada se pokrene formula, vrednost će samo dovesti do vrednosti Blank().

Belešku

JSON podržava null vrednosti za polja. To će takođe rezultirati praznim vrednostima Blank(). Trenutno ne postoji razlika između Power Fx polja koje nedostaje ili polja koje ima vrednost null.

Kako se pristup poljima na netipiziranim objektima ne procenjuje prilikom pisanja formule, tehnologija Intellisense takođe nije dostupna. I JSON i Power Fx su osetljivi na mala i velika slova, zato dodatno vodite računa o pisanju imena polja.

JSON vrednosti ne moraju biti u notaciji u stilu zapisa. Važeći JSON može biti samo vrednost, kao što je "text value", true ili 123.456. U tom slučaju, netipizirani objekat koji ParseJSON vraća je sama vrednost i tačkasta notacija se ne koristi.

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

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

Konačno, JSON podržava ugnežđene zapise. Konvertovanje takvog JSON-a u netipiziran objekat rezultira ugnežđenim objektima, a tačkaste notacije mogu da se koriste za detaljan prelazak preko hijerarhije.

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

Kada konvertujete ovu JSON nisku u promenljivu netipiziranog objekta pod nazivom jsonObject, poljima se može pristupiti pomoću tačkaste notacije.

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"

Ako bilo koje od polja u izrazu sa tačkastom notacijom ne postoji, biće vraćena vrednost Blank().

Nizovi i tabele

JSON može da sadrži nizove vrednosti ili zapisa. Tim nizovima se može pristupiti direktno ili konvertovati u Power Fx tabele.

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

Ovaj JSON sadrži zapis sa poljem pod nazivom OrderLines koje sadrži niz zapisa. Svaki zapis ima dva polja: Item i Quantity. Ako je JSON konvertovan u netipizirani objekat pomoću funkcije ParseJSON i postavljen na promenljivu pod imenom jsonOrder, možemo da pristupimo pojedinačnim redovima porudžbine na nekoliko načina.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Pojedinačne zapise i vrednosti možete da preuzmete pomoću funkcije Index(). Na primer, da biste dobili drugi zapis u polju OrderLines, pristupite polju Quantity i konvertujte ga u vrednost.

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

Niz redova porudžbine možete da konvertujete direktno u tabelu. Na taj način ćete kreirati tabelu sa jednom kolonom sa netipiziranim objektom koji predstavlja zapis.

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

Tabela sa jednom kolonom 'orderLines' sada ima kolonu 'Value' koja predstavlja netipizirani objekat. Da biste koristili bilo koje polje iz zapisa u ovoj tabeli, koristite tačkastu notaciju da biste pristupili određenom JSON polju u netipiziranom objektu u koloni Value.

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

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

Da biste jednostavnije iskoristili zapise reda porudžbine u drugim delovima aplikacije, ceo netipizirani objekat možete da konvertujete u potpuno tipizirani zapis pomoću funkcije ForAll(). Obezbeđivanje netipiziranog objekta direktno u ForAll() znači da možete direktno da pristupite poljima objekta umesto da koristite polje sa jednom kolonom Value.

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

Nova promenljiva typedOrderLines je sada potpuno tipizirana Power Fx tabela sa sledećim kolonama i vrednostima:

Stavka Količina
"Vidžet 1" 3
"Vidžet 2" 5

Prethodni primeri koriste nizove zapisa, ali JSON takođe može da sadrži nizove samo vrednosti. Uzmite u obzir sledeći primer važeće JSON niske koja sadrži niz od tri niske.

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

Jednu od stavki iz niza možemo preuzeti pomoću funkcije Index() i konvertovati je u tekst.

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