Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met Power Fx kunnen makers JSON lezen in een dynamische waarde met behulp van de functie ParseJSON .
Waarden lezen en converteren
ParseJSON converteert de volgende JSON-recordtekenreeks naar een dynamische record met veldenItemName, QuantityReleaseDateen AvailableForPreOrder.
{
"ItemName" : "Widget 1",
"Quantity" : 46,
"ReleaseDate" : "2022-09-01",
"AvailableForPreOrder" : true
}
Elk van de velden kan worden geopend met behulp van de punt notatie op de dynamische waarde die wordt geretourneerd door 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 ) );
Over het algemeen is het een goed idee om expliciet een dynamische waarde te converteren naar een specifiek type. Als u een dynamische waarde instelt als variabele, wordt de variabele ook een dynamische waarde. Het is dus waarschijnlijk nodig om een dergelijke waarde expliciet te converteren bij het instellen in een variabele. In de meeste gevallen worden dynamische waarden echter automatisch geconverteerd naar een specifiek type ('coerce') wanneer ze worden gebruikt als functieparameters waarbij het type een eenvoudig type is, zoals Booleaanse waarde, getal of tekst, en het parameterprofiel van de functie geen potentiële conflicterende overbelastingen heeft.
Left( dynamic.ItemName, 1 ); // "W"
Radians( dynamic.Quantity ); // 0.80285146
If (dynamic.AvailableForPreOrder, "Available", "Not Available" ); // "Available"
Naast het automatisch converteren van het type in functie-aanroepen, worden dynamische waarden, indien mogelijk, ook geconverteerd naar besturingseigenschappen.
Label1.Text: dynamic.Quantity
InputText1.Default: dynamic.ItemName
En ten slotte wordt bij het gebruik van operators zoals & of +een dynamische waarde afgetrokken als er geen dubbelzinnigheid is op het verwachte type.
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
Notitie
JSON heeft geen GUID, Color, Time of DateTime type. Deze waarden worden weergegeven als een tekenreeks. Als u rechtstreeks een dynamische JSON-waarde met een datum aan een teksteigenschap toewijst, wordt de oorspronkelijke tekst van de JSON gebruikt. Dit kan belangrijk zijn bij het omgaan met tijdzones, datumnotaties, enzovoort. In dergelijke gevallen moet u de waarden expliciet converteren met GUID(), ColorValue(), DateValue(), DateTimeValue(), enzovoort.
Als een veldnaam uit een ongeldige identificatienaam bestaat, bijvoorbeeld wanneer de veldnamen beginnen met een cijfer of ongeldige tekens bevatten, zoals een koppelteken, kunt u de veldnamen tussen enkele aanhalingstekens plaatsen:
dynamic.'01'
dynamic.'my-field'
Power Fx evalueert het bestaan van het veld pas als de formule wordt uitgevoerd. Dit zorgt voor flexibiliteit in de inkomende JSON. De vorige JSON kan bijvoorbeeld soms een extra veld genaamd Discount bevatten. Maar in ons vorige voorbeeld is dit veld niet aanwezig. Een formule schrijven die gebruikmaakt van het veld Discount levert geen fouten op tijdens het proces van het maken van de app of wanneer gebruikers de app gebruiken. Als het veld ontbreekt wanneer de formule wordt uitgevoerd, resulteert de waarde alleen in de waarde Blank().
Notitie
JSON ondersteunt null waarden voor velden. Deze resulteren ook in de waarde Blank(). Momenteel is er geen onderscheid in Power Fx tussen een ontbrekend veld of een veld met de waarde null.
Omdat het openen van velden van een dynamische waarde niet wordt geëvalueerd bij het schrijven van de formule, is er ook geen IntelliSense beschikbaar. Zowel JSON als Power Fx is hoofdlettergevoelig, dus wees extra voorzichtig bij het uitschrijven van veldnamen.
JSON waarden hoeven niet in een record-stijl notatie te zijn. Een geldige JSON kan gewoon een waarde zijn, zoals "text value", true of 123.456. In dat geval is de dynamische waarde die ParseJSON retourneert de waarde zelf en wordt de punt notatie niet gebruikt.
Set( myText, Boolean( ParseJSON( "true" ) ) );
Set( myNumber, Value( ParseJSON( "123.456" ) ) );
JSON ondersteunt ook geneste records. Als u dergelijke JSON converteert naar een dynamische waarde, resulteert dit in geneste objecten en kan de punt notatie worden gebruikt om de hiërarchie te doorlopen.
{
"Version" : 1,
"RootElement" : {
"Parent" : {
"Name" : "This is the parent",
"Child" : {
"Name" : "This is the child"
}
}
}
}
Wanneer u deze JSON-tekenreeks converteert naar een dynamische variabele met de naam jsonObject, kunnen de velden worden geopend met behulp van de punt notatie.
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"
Als een van de velden in de puntnotatie-expressie niet bestaat, wordt Blank() geretourneerd.
Matrices en tabellen
JSON kan arrays met waarden of records bevatten. Deze matrices zijn direct toegankelijk of kunnen worden geconverteerd naar Power Fx-tabellen.
{
"OrderNumber" : "SO000010",
"CustomerID" : "CUST0126",
"OrderLines" : [
{
"Item" : "Widget 1",
"Quantity" : 3
},
{
"Item" : "Widget 2",
"Quantity" : 5
}
]
}
Deze JSON bevat een record met een veld met de naam OrderLines, dat een matrix met records bevat. Elk record heeft twee velden: Item en Quantity. Als de JSON wordt geconverteerd naar een dynamische waarde met behulp van de functie ParseJSON en is ingesteld op een variabele met de naam jsonOrder, hebben we op verschillende manieren toegang tot de afzonderlijke orderregels.
Set( jsonOrder, ParseJSON( jsonStringVariable ) );
U kunt afzonderlijke records en waarden ophalen met behulp van de functie Index(). U kunt bijvoorbeeld de tweede record in het veld OrderLines ophalen en vervolgens het veld Quantity openen en deze converteren naar een waarde.
Set( line2Quantity, Value( Index( jsonOrder.OrderLines, 2 ).Quantity ) ); // 5
U kunt de matrix met orderregels direct naar een tabel converteren. Hiermee maakt u een tabel met één kolom met een dynamische waarde die de record vertegenwoordigt.
Set( orderLines, Table( jsonOrder.OrderLines ) );
Tabel met één kolom 'orderLines' heeft nu een kolom 'Waarde' die de dynamische waarde vertegenwoordigt. Als u een van de velden uit een record in deze tabel wilt gebruiken, gebruikt u de punt notatie voor toegang tot het specifieke JSON-veld op de dynamische waarde in de Value kolom.
Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table
Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"
Als u het gebruik van de orderregelrecords eenvoudiger en eenvoudiger wilt maken in andere delen van uw app, kunt u de hele dynamische waarde converteren naar een volledig getypte record met behulp van de functie ForAll(). Als u de dynamische waarde rechtstreeks op ForAll() opgeeft, hebt u rechtstreeks toegang tot de objectvelden in plaats van het veld met één kolom Value .
Set( typedOrderLines, ForAll( jsonOrder.OrderLines, { Item : Text( ThisRecord.Item ), Quantity : Value( ThisRecord.Quantity ) } ) );
De nieuwe variabele typedOrderLines is nu een volledige getypeerde Power Fx-tabel met de volgende kolommen en waarden:
| Artikel | Aantal |
|---|---|
| "Widget 1" | 5 |
| "Widget 2" | 5 |
De vorige voorbeelden gebruiken recordmatrices, maar JSON kan ook matrices met alleen waarden bevatten. Bekijk het volgende voorbeeld dat een geldige JSON-tekenreeks is met een matrix van drie tekenreeksen.
[ "First Item", "Second Item", "Third Item"]
We kunnen een van de items uit de matrix ophalen met behulp van de functie Index() en deze converteren naar tekst.
Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"