Merk
Tilgang til denne siden krever autorisasjon. Du kan prøve å logge på eller endre kataloger.
Tilgang til denne siden krever autorisasjon. Du kan prøve å endre kataloger.
Power Fx gjør det mulig for utviklere å lese JSON til en dynamisk verdi ved hjelp av ParseJSON-funksjonen .
Lese og konvertere verdier
ParseJSON konverterer følgende JSON-poststreng til en dynamisk post med felt ItemName, QuantityReleaseDate og AvailableForPreOrder.
{
"ItemName" : "Widget 1",
"Quantity" : 46,
"ReleaseDate" : "2022-09-01",
"AvailableForPreOrder" : true
}
Du kan få tilgang til hvert av feltene ved hjelp av prikk-notasjonen på den dynamiske verdien som returneres fra ParseJSON.
Set( dynvalue, ParseJSON( jsonStringVariable ) );
Set( item, Text ( dynamic.ItemName ) );
Set( quantity, Value ( dynamic.Quantity ) );
Set( release, DateValue ( dynamic.ReleaseDate ) );
Set( preorder, Boolean ( dynamic.AvailableForPreOrder ) );
Det er generelt lurt å eksplisitt konvertere en dynamisk verdi til en bestemt type. Hvis du angir en dynamisk verdi som en variabelverdi, blir variabelen også en dynamisk verdi. Det er derfor sannsynlig at du må konvertere en slik verdi eksplisitt når du angir en variabel. Men i de fleste tilfeller konverteres dynamiske verdier til en bestemt type automatisk («tvang») når den brukes som funksjonsparametere der typen er en enkel type som boolsk, tall eller tekst, og funksjonens parameterprofil ikke har potensielle motstridende overbelastninger.
Left( dynamic.ItemName, 1 ); // "W"
Radians( dynamic.Quantity ); // 0.80285146
If (dynamic.AvailableForPreOrder, "Available", "Not Available" ); // "Available"
I tillegg til automatisk konvertering av typen i funksjonskall, konverteres dynamiske verdier også når de tilordnes til kontrollegenskaper, der det er mulig.
Label1.Text: dynamic.Quantity
InputText1.Default: dynamic.ItemName
Og til slutt, når du bruker operatorer som & eller +, vil en dynamisk verdi bli tvunget hvis det ikke er tvetydighet på den forventede typen.
dynamic.Quantity + 1 // result is a number
dynamic.ItemName & " (preorder)" // result is text
dynamic.Quantity + dynamic.Quantity // result is a number
dynamic.Quantity & dynamic.ItemName // result is text
Merk
JSON har ikke en GUID-, Color-, Time - eller DateTime-type . Disse verdiene representeres som en streng. Hvis du tilordner en JSON-dynamisk verdi som inneholder en dato til en tekstegenskap direkte, 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:
dynamic.'01'
dynamic.'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.
Ettersom tilgang til felt av en dynamisk verdi ikke evalueres når du skriver formelen, 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 et slikt tilfelle er den dynamiske verdien som ParseJSON returnerer, selve verdien, og punktnoteringen brukes ikke.
Set( myText, Boolean( ParseJSON( "true" ) ) );
Set( myNumber, Value( ParseJSON( "123.456" ) ) );
Til slutt støtter JSON nestede oppføringer. Konvertering av slik JSON til en dynamisk verdi resulterer i nestede objekter, og punktmerkingen 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 dynamisk variabel med navnet jsonObject, kan du få tilgang til feltene ved hjelp av punktmerkingen.
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 en dynamisk verdi ved hjelp av ParseJSON-funksjonen og settes 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 en dynamisk verdi som representerer posten.
Set( orderLines, Table( jsonOrder.OrderLines ) );
Ordrelinjer i én kolonne har nå en Verdi-kolonne som representerer den dynamiske verdien. Hvis du vil bruke noen av feltene fra en post i denne tabellen, bruker du prikke notasjonen til å få tilgang til det bestemte JSON-feltet på den dynamiske verdien i Value kolonnen.
Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table
Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"
Hvis du vil gjøre bruken av ordrelinjepostene enklere og enklere i andre deler av appen, kan du konvertere hele dynamisk verdi til en fullstendig skrevet post ved hjelp av ForAll() -funksjonen. Hvis du gir dynamisk verdi direkte til ForAll(), får du tilgang til objektfeltene direkte i stedet for å bruke feltet med én kolonne 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"