Lucrul cu JSON în Power Fx
Power Fx permite creatorilor să citească JSON într-un obiect netipizat folosind funcția ParseJSON.
Citirea și conversia valorilor
ParseJSON va converti următorul JSON șir de înregistrare într-un obiect fără tip cu câmpuri ItemName
, Quantity
, ReleaseDate
și AvailableForPreOrder
.
{
"ItemName" : "Widget 1",
"Quantity" : 46,
"ReleaseDate" : "2022-09-01",
"AvailableForPreOrder" : true
}
Fiecare dintre câmpuri poate fi accesat utilizând notația cu puncte de pe valoarea Obiect netipizat returnată de la 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 ) );
În general, este un idee bun pentru a converti în mod explicit valoarea unui obiect fără tip într-un anumit tip. Setarea unui obiect fără tip ca valoare variabilă face ca variabila să fie, de asemenea, un obiect fără tip . Deci, conversia unei astfel de valori în mod explicit atunci când se setează la o variabilă este probabil necesară. Dar, în majoritatea cazurilor, valorile obiect fără tip se vor converti automat într-un anumit tip („constrângere”) atunci când sunt utilizate ca parametri ai funcției, unde tipul este un tip simplu, cum ar fi Boolean, număr sau text, iar profilul de parametri al funcției nu are potențiale conflicte. suprasarcini.
Left( untyped.ItemName, 1 ); // "W"
Radians( untyped.Quantity ); // 0.80285146
If (untyped.AvailableForPreOrder, "Available", "Not Available" ); // "Available"
Pe lângă conversia automată a tipului în apeluri de funcție, obiectele netipizate vor fi, de asemenea, convertite atunci când sunt atribuite proprietăților de control, acolo unde este posibil.
Label1.Text: untyped.Quantity
InputText1.Default: untyped.ItemName
Și, în sfârșit, când folosesc operatori cum ar fi & sau +, și obiect fără tip va fi constrâns dacă nu există nicio ambiguitate asupra tipului așteptat.
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
Notă
JSON nu are GUID, Culoare, Tipul sau DateTime . Aceste valori sunt reprezentate sub formă de șir. Dacă atribuiți o valoare JSON obiect fără tip care conține o dată unei proprietăți text direct, textul original al JSON va fi folosit. Acest lucru poate fi important atunci când aveți de-a face cu fusurile orare, formatele de date etc. În astfel de cazuri, ar trebui să convertiți în mod explicit valorile folosind GUID(), ColorValue(), DateValue(), DateTimeValue() etc.
În cazul în care un nume de câmp constă dintr-un nume de identificare nevalid, de exemplu atunci când numele câmpului începe cu un număr sau conține caractere nevalide, cum ar fi o cratimă, puteți pune numele câmpurilor între ghilimele simple:
untyped.'01'
untyped.'my-field'
Power Fx nu va evalua existența câmpului până când formula nu este rulată. Acest lucru permite flexibilitate în JSON primit. De exemplu, precedentul JSON poate conține uneori un câmp suplimentar numit Discount
. Dar în exemplul nostru anterior, acest câmp nu este prezent. Scrierea unei formule care utilizează câmpul Discount
nu va duce la erori, în timpul procesului de creare a aplicației sau atunci când utilizatorii folosesc aplicația. Dacă câmpul lipsește atunci când se rulează formula, valoarea va avea ca rezultat doar o valoare Blank().
Notă
JSON acceptă null
valori pentru câmpuri. Acestea vor avea ca rezultat, de asemenea, valori Blank(). În prezent, nu există nicio distincție în Power Fx între un câmp lipsă sau un câmp care are valoarea null
.
Deoarece accesarea câmpurilor de pe Obiecte netipizate nu este evaluată la scrierea formulei, nu este niciun Intellisense disponibil. Atât JSON cât și Power Fx sunt sensibile la majuscule și minuscule, așa că aveți grijă deosebită când scrieți numele câmpurilor.
Valorile JSON nu trebuie să fie într-o notație în stil de înregistrare.
JSON valid poate fi doar o valoare, cum ar fi "text value"
, true
sau 123.456
. Într-un astfel de caz, Obiectul netipizat pe care ParseJSON îl întoarce este valoarea în sine, iar notația cu puncte nu este folosit.
Set( myText, Boolean( ParseJSON( "true" ) ) );
Set( myNumber, Value( ParseJSON( "123.456" ) ) );
În cele din urmă, JSON acceptă înregistrări imbricate. Convertirea unui astfel de JSON în Obiect netipizat rezultă obiecte imbricate, iar notația cu puncte poate fi folosită pentru a parcurge ierarhia.
{
"Version" : 1,
"RootElement" : {
"Parent" : {
"Name" : "This is the parent",
"Child" : {
"Name" : "This is the child"
}
}
}
}
Când convertiți acest șir JSON într-o variabilă Obiect netipizat numită jsonObject
, câmpurile pot poate fi accesat folosind notația cu puncte.
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"
Dacă oricare dintre câmpurile din expresia de notare a punctelor nu există, va fi returnat Blank().
Matrice și tabele
JSON poate conține matrice de valori sau înregistrări. Aceste matrice pot fi accesate direct sau convertite în tabele Power Fx.
{
"OrderNumber" : "SO000010",
"CustomerID" : "CUST0126",
"OrderLines" : [
{
"Item" : "Widget 1",
"Quantity" : 3
},
{
"Item" : "Widget 2",
"Quantity" : 5
}
]
}
Acest JSON onține o înregistrare cu un câmp numit OrderLines
care conține o serie de înregistrări. Fiecare înregistrare are două câmpuri: Item
și Quantity
. Dacă JSON este convertit într-un Obiect netipizat folosind funcția ParseJSON și setat la o variabilă numită jsonOrder
, putem accesa liniile individuale de comandă în mai multe moduri.
Set( jsonOrder, ParseJSON( jsonStringVariable ) );
Puteți prelua înregistrări și valori individuale utilizând funcția Index(). De exemplu, pentru a obține a doua înregistrare în câmpul OrderLines
, accesați apoi câmpul Quantity
și convertiți-l într-o valoare.
Set( line2Quantity, Value( Index( jsonOrder.OrderLines, 2 ).Quantity ); // 5
Puteți converti matricea de linii de comandă direct într-un tabel. Aceasta va crea un tabel cu o singură coloană cu un Obiect netipizat reprezentând înregistrarea.
Set( orderLines, Table( jsonOrder.OrderLines ) );
Tabelul cu o singură coloană „orderLines” are acum o coloană „Valoare” care reprezintă Obiectul netipizat. Pentru a utiliza oricare dintre câmpurile dintr-o înregistrare din acest tabel, utilizați notația cu puncte pentru a accesa câmpul JSON specific din Obiect netipizat din coloana Value
.
Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table
Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"
Pentru a face utilizarea înregistrărilor liniei de comandă mai ușoară și mai simplă în alte părți ale aplicației dvs., puteți converti întregul Obiect netipizat într-o înregistrare complet introdusă folosind funcția ForAll(). Furnizarea Obiectului netipizat direct către ForAll() înseamnă că puteți accesa câmpurile obiect direct în loc să utilizați câmpul cu o coloană Value
.
Set( typedOrderLines, ForAll( jsonOrder.OrderLines, { Item : Text( ThisRecord.Item ), Quantity : Value( ThisRecord.Quantity ) } ) );
Noua variabilă typedOrderLines
este acum un tabel Power Fx complet tipizat cu următoarele coloane și valori:
Element | Cantitate |
---|---|
„Widget 1” | 3 |
„Widget 2” | 5 |
Exemplele anterioare folosesc matrice de înregistrări, dar JSON poate conține și matrice doar de valori. Luați în considerare următorul exemplu care este un șir JSON valid care conține o matrice de trei șiruri.
[ "First Item", "Second Item", "Third Item"]
Putem prelua unul dintre elementele din matrice folosind funcția Index() și îl putem converti în text.
Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"