Del via


Arbejde med JSON i Power Fx

Power Fx giver udviklere mulighed for at læse JSON i et objekt uden type ved hjælp af funktionen ParseJSON.

Læse og konvertere værdier

ParseJSON konverterer følgende JSON-poststreng til et objekt uden type med felterne ItemName, Quantity, ReleaseDate og AvailableForPreOrder.

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

Du kan få adgang til de enkelte felter ved hjælp af punktnotationen på den værdi af objekt uden type, der 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 som regel en god idé eksplicit at konvertere værdien af et objekt uden type til en bestemt type. Hvis et objekt uden type angives som en variabelværdi, bliver variablen også et objekt uden type. Det er derfor sandsynligt, at du skal konvertere en sådan værdi eksplicit, når du angiver den til en variabel. Men i de fleste tilfælde konverteres værdier af objekt uden type automatisk til en bestemt type ("tvungen"), når de bruges som funktionsparametre, hvor typen er en simpel type som f.eks. boolesk, tal eller tekst, og funktionens parameterprofil ikke har potentielle konfliktskabende overbelastninger.

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

Ud over automatisk konvertering af typen i funktionskald konverteres objekter uden type også, når de tildeles til kontrolegenskaber, hvor det er muligt.

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

Når der bruges operatorer som f.eks. & eller +, bliver et Objekt uden type konverteret, hvis der ikke er tvetydighed omkring den forventede type.

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

Bemærk

JSON har ikke GUID, Color, Time eller DateTime som type. Disse værdier repræsenteres som en streng. Hvis du tildeler en JSON-værdi af objekt uden type , der indeholder en dato til en tekstegenskab direkte, bruges den oprindelige tekst i JSON. Dette kan være vigtigt, når du arbejder med tidszoner, datoformater osv. I disse tilfælde skal du eksplicit konvertere værdierne ved hjælp af GUID(), ColorValue(), DateValue(), DateTimeValue() osv.

Hvis et feltnavn består af et ugyldigt id-navn, f.eks. når feltnavnene starter med et tal eller indeholder ugyldige tegn, f.eks. en bindestreg, kan du angive feltnavnene i enkelte anførselstegn:

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

Power Fx evaluerer ikke eksistensen af feltet, før formlen køres. Dette giver fleksibilitet i indgående JSON. Det tidligere JSON kan f.eks. indeholde et ekstra felt, der kaldes Discount. Men i vores tidligere eksempel er dette felt ikke til stede. Hvis du skriver en formel, der bruger feltet Discount, opstår der ingen fejl, når appen oprettes, eller når brugerne benytter appen. Hvis feltet mangler, når formlen kører, resulterer værdien blot i en Blank()-værdi.

Bemærk

JSON understøtter null-værdier for felter. Disse vil også resultere i Blank()-værdier. I øjeblikket skelnes der i Power Fx ikke mellem et manglende felt eller et felt, der har værdien null.

Da adgang til felter på objekter uden type ikke evalueres, når formlen skrives, er der heller ingen Intellisense tilgængelig. Både JSON og Power Fx skelner mellem store og små bogstaver, så vær omhyggelig, når du skriver feltnavne.

JSON-værdier behøver ikke at have notation i postformat. Gyldig JSON kan kun være en værdi, f.eks. "text value", true eller 123.456. I dette tilfælde er det objekt uden type, som ParseJSON returnerer, selve værdien, og punktnotationen bruges ikke.

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

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

Endelig understøtter JSON indlejrede poster. Konvertering af en sådan JSON til objekt uden type resulterer i indlejrede objekter, og punktnotationen kan bruges til at gå igennem hierarkiet.

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

Når du konverterer denne JSON-streng til en objekt uden type-variabel med navnet jsonObject, kan du få adgang til felterne ved hjælp af punktnotationen.

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 et af felterne i punktnotationsudtrykket ikke findes, returneres Blank().

Matrixer og tabeller

JSON kan indeholde matrixer med værdier eller poster. Du kan få direkte adgang til disse matrixer eller konvertere dem til Power Fx-tabeller.

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

Dette JSON indeholder en post med et felt med navnet OrderLines, som indeholder en matrix med poster. Hver post indeholder to felter: Item og Quantity. Hvis JSON konverteres til et objekt uden type ved hjælp af funktionen ParseJSON og angives til en variabel med navnet jsonOrder, kan du få adgang til de enkelte ordrelinjer på flere måder.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Du kan hente individuelle poster og værdier ved hjælp af funktionen Index(). Du kan f.eks. hente den anden post i feltet OrderLines ved at åbne feltet Quantity og konvertere det til en værdi.

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

Du kan konvertere matrixen med ordrelinjer direkte til en tabel. Derved oprettes der en tabel med en enkelt kolonne med et objekt uden type, der repræsenterer posten.

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

Tabellen 'orderLines' med en enkelt kolonne indeholder nu kolonnen 'Value', der repræsenterer objektet uden type. Hvis du vil bruge et af felterne fra en post i denne tabel, skal du bruge punktnotationen til at få adgang til det specifikke JSON-felt for objektet uden type i kolonnen Value.

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

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

Hvis du vil gøre det nemmere at bruge ordrelinjeposterne i andre dele af appen, kan du konvertere hele objektet uden type til en typepost ved hjælp af funktionen ForAll(). Hvis du angiver objektet uden type direkte til ForAll(), kan du få direkte adgang til objektfelterne i stedet for at bruge feltet Value med en enkelt kolonne.

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

Den nye typedOrderLines-variabel er nu en fuldt skrevet Power Fx-tabel med følgende kolonner og værdier:

Item Quantity
"Widget 1" 3
"Widget 2" 5

I ovenstående eksempler bruges matrixer med poster, men JSON kan også indeholde matrixer bare med værdier. Se på følgende eksempel, der er en gyldig JSON-streng, som indeholder en matrix på tre strenge.

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

Vi kan hente et af elementerne fra matrixen ved hjælp af funktionen Index() og konvertere det til tekst.

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