Arbeid med JSON i Power Fx
Power Fx gjør det mulig for beslutningstakere å lese JSON i et objekt uten type ved hjelp av funksjonen ParseJSON.
Lese og konvertere verdier
ParseJSON konverterer følgende JSON-poststreng til et typeløst objektmed felt ItemName
, Quantity
, ReleaseDate
og AvailableForPreOrder
.
{
"ItemName" : "Widget 1",
"Quantity" : 46,
"ReleaseDate" : "2022-09-01",
"AvailableForPreOrder" : true
}
Du kan få tilgang til hvert av feltene ved hjelp av punkt notasjonen på Objekt uten type-verdien som returneres fra 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 ) );
Det er vanligvis lurt å eksplisitt konvertere verdien for et typeløst objekt til en bestemt type. Angivelse av et typeløst objekt som en variabelverdi gjør også variabelen til et typeløst objekt. Det er derfor sannsynlig at du må konvertere en slik verdi eksplisitt når du angir en variabel. I de fleste tilfeller konverteres imidlertid typeløse objektverdier automatisk til en bestemt type (tvunget) når de brukes som funksjonsparametere, der typen er en enkel type som boolsk, tall eller tekst, og funksjonens parameterprofil ikke har potensielle overbelastninger i konflikt.
Left( untyped.ItemName, 1 ); // "W"
Radians( untyped.Quantity ); // 0.80285146
If (untyped.AvailableForPreOrder, "Available", "Not Available" ); // "Available"
I tillegg til automatisk å konvertere typen i funksjonskall, konverteres også typeløse objekter når de tildeles til kontrollegenskaper, der det er mulig.
Label1.Text: untyped.Quantity
InputText1.Default: untyped.ItemName
Og til slutt, når du bruker operatorer, for eksempel & elle +, blir et typeløst objekt påtvunget hvis det ikke er tvetydighet for den forventede typen.
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
Merk
JSON har ikke en GUID-, Color-, Time - eller DateTime-type . Disse verdiene representeres som en streng. Hvis du tildeler en typeløs JSON-objektverdi som inneholder en dato, direkte til en tekstegenskap, brukes den opprinnelige teksten i JSON. Dette kan være viktig når du arbeider med tidssoner, datoformater og så videre. I slike tilfeller bør du eksplisitt konvertere verdiene ved hjelp av GUID(), ColorValue(), DateValue(), DateTimeValue() osv.
Hvis et feltnavn består av et ugyldig identifikatornavn, for eksempel når feltnavnene starter med et tall eller inneholder ugyldige tegn, for eksempel en bindestrek, kan du plassere feltnavnene i enkle anførselstegn:
untyped.'01'
untyped.'my-field'
Power Fx vil ikke evaluere eksistensen til feltet før formelen er kjørt. Dette gir fleksibilitet i den innkommende JSON. Den forrige JSON an for eksempel noen ganger inneholde et ekstra felt kalt Discount
. Men i det forrige eksemplet er ikke dette feltet til stede. Skriving av en formel som bruker Discount
-feltet, fører ikke til feil, under oppretting av appen eller når brukerne bruker appen. Hvis feltet mangler når formelen kjører, fører verdien bare til en Blank()-verdi.
Merk
JSON støtter null
verdier for felt. Dette fører også til Blank()-verdier. Det skilles for øyeblikket ikke mellom et manglende felt i Power Fx eller et felt som har verdien null
.
Siden tilgang til feltene på Objekter uten type ikke evalueres når formelen skrives, er det heller ingen Intellisense tilgjengelig. Både JSON og Power Fx skiller mellom små og store bokstaver, så du bør være ekstra forsiktig med å skrive ut feltnavn.
JSON-verdier trenger ikke å være i en notasjon i poststil. Gyldig JSON kan bare være en verdi, for eksempel "text value"
, true
eller 123.456
. I slike tilfeller er Objekt uten type som ParseJSON returnerer, selve verdien, og punktnotasjonen brukes ikke.
Set( myText, Boolean( ParseJSON( "true" ) ) );
Set( myNumber, Value( ParseJSON( "123.456" ) ) );
Til slutt støtter JSON nestede oppføringer. Konvertering av slike JSON til Objekt uten type fører til nestede objekter, og punktnotasjonen kan brukes til å krysse hierarkiet.
{
"Version" : 1,
"RootElement" : {
"Parent" : {
"Name" : "This is the parent",
"Child" : {
"Name" : "This is the child"
}
}
}
}
Når du konverterer denne JSON-strengen til en Objekt uten type-variabel med navnet jsonObject
, kan feltene nås ved å bruke punktnotasjonen.
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"
Hvis noen av feltene i punktnotasjonsuttrykket ikke finnes, returneres Blank().
Matriser og tabeller
JSON kan inneholde matriser med verdier eller poster. Du kan få direkte tilgang til disse matrisene, eller de kan konverteres til Power Fx-tabeller.
{
"OrderNumber" : "SO000010",
"CustomerID" : "CUST0126",
"OrderLines" : [
{
"Item" : "Widget 1",
"Quantity" : 3
},
{
"Item" : "Widget 2",
"Quantity" : 5
}
]
}
Denne JSON inneholder en oppføring med et felt som kalles OrderLines
, som inneholder en matrise med oppføringer. Hver oppføring har to felt: Item
og Quantity
. Hvis JSON konverteres til et Objekt uten type med ParseJSON-funksjonen og satt til en variabel med navnet jsonOrder
, kan vi få tilgang til de individuelle ordrelinjene på flere måter.
Set( jsonOrder, ParseJSON( jsonStringVariable ) );
Du kan hente enkeltoppføringer og verdier ved hjelp av Index()-funksjonen. Hvis du for eksempel vil hente den andre oppføringen i OrderLines
-feltet, får du tilgang til feltet Quantity
og konverterer det til en verdi.
Set( line2Quantity, Value( Index( jsonOrder.OrderLines, 2 ).Quantity ); // 5
Du kan konvertere matrisen med ordrelinjer direkte til en tabell. Dette oppretter en tabell med én kolonne med et Objekt uten type som representerer oppføringen.
Set( orderLines, Table( jsonOrder.OrderLines ) );
orderLines for enkeltkolonne har nå en Verdi-kolonne som representerer Objekt uten type. Hvis du vil bruke noen av feltene fra en oppføring i denne tabellen, bruker du punktnotasjonen til å få tilgang til det spesifikke JSON-feltet på Objekt uten type i Value
-kolonnen.
Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table
Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"
For å gjøre bruken av ordrelinjeoppføringene enklere og i andre deler av appen, kan du konvertere hele Objekt uten type til en fullstendig skrevet oppføring ved hjelp av ForAll()-funksjonen. Hvis du oppgir Objekt uten type direkte for ForAll(), betyr det at du kan få direkte tilgang til objektfeltene i stedet for å bruke enkeltkolonnefeltet Value
.
Set( typedOrderLines, ForAll( jsonOrder.OrderLines, { Item : Text( ThisRecord.Item ), Quantity : Value( ThisRecord.Quantity ) } ) );
Den nye typedOrderLines
-variabelen er nå en fullstendig Power Fx-tabell med type med følgende kolonner og verdier:
Vare | Antall |
---|---|
"Kontrollprogram 1" | 3 |
"Kontrollprogram 2" | Fem |
De forrige eksemplene bruker matriser med oppføringer, men JSON kan også inneholde matriser med bare verdier. Vurder følgende eksempel som en gyldig JSON-streng som inneholder en matrise med tre strenger.
[ "First Item", "Second Item", "Third Item"]
Vi kan hente ett av elementene fra matrisen ved hjelp av Index() -funksjonen, og konvertere det til tekst.
Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"