Kopīgot, izmantojot


Sadarbība ar JSON Power Fx

Power Fx ļaus veidotājiem lasīt JSON iekš Netipēta objekta, izmantojot ParseJSON funkciju.

Vērtību lasīšana un pārvēršana

ParseJSON pārveidos šādu JSON ierakstu virkni par netipizēts objekts ar laukiem ItemName, QuantityReleaseDate un AvailableForPreOrder.

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

Katram no laukiem var piekļūt, izmantojot punkta notāciju Netipēta objekta vērtībā, kas tiek atgriezta no 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 ) );

Parasti ir laba ideja skaidri konvertēt netipizēts objekts vērtību uz konkrētu veidu. Iestatot netipizēts objekts kā mainīgu vērtību, mainīgais kļūst netipizēts objekts arī. Tātad, iespējams, ir nepieciešama šādas vērtības tieša konvertēšana, iestatot uz mainīgo. Bet vairumā gadījumu netipizēts objekts vērtības automātiski tiks pārveidotas par konkrētu tipu ("piespiešana"), ja tās tiks izmantotas kā funkcijas parametri, kur tips ir vienkāršs tips, piemēram, Būla, skaitlis vai teksts, un funkcijas parametru profilam nav potenciālu konfliktējošu pārslodzes.

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

Papildus automātiskai tipa konvertēšanai funkciju izsaukumos, ja iespējams, tiks konvertēti arī neierakstīti objekti, ja tie tiks piešķirti vadības rekvizītiem.

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

Un visbeidzot, izmantojot tādus operatorus& vai +, netipizēts objekts tiks piespiests, ja nebūs neskaidrību par paredzamo veidu.

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

Piezīmes

JSON nav tipa GUID, Color, Time vai DateTime . Šīs vērtības tiek attēlotas kā virkne. Ja teksta rekvizītam tieši piešķirat JSON netipizēts objekts vērtību, kas satur datumu, tiks izmantots JSON sākotnējais teksts . Tas var būt svarīgi, strādājot ar laika joslām, datumu formātiem utt. Šādos gadījumos vērtības ir skaidri jākonvertē, izmantojot GUID(), ColorValue(), DateValue(), DateTimeValue() utt.

Ja lauka nosaukums sastāv no nederīga identifikatora nosaukuma, piemēram, ja lauku nosaukumi sākas ar skaitli vai satur nederīgas rakstzīmes, piemēram, zilums, lauku nosaukumus var ievietot vienpēdiņās:

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

Power Fx neanalizēs šī lauka esamību tik ilgi, kamēr formula tiek izmantota. Tas sniedz ienākošā JSON elastību. Piemēram, iepriekšējais JSON dažkārt var ietvert papildu lauku, ko sauc Discount. Taču mūsu iepriekšējā piemērā šis lauks nav pieejams. Rakstot formulas, kas izmanto Discount lauku, netiks radītas kļūdas, programmas veidošanas laikā vai brīdī, kad lietotāji izmantos šo programmu. Ja formulas izmantošanas laikā lauka nav, vērtība rezultēsies Blank() vērtībā.

Note

JSON atbalsta null lauku vērtības. Rezultātā tiks iegūtas arī vērtības Blank(). Pašlaik pakalpojumā Power Fx nav atšķirības starp trūkstošu lauku vai lauku, kura vērtība ir null.

Tā kā piekļuve laukiem Netipētos objektos netiek analizēta formulas rakstīšanas laikā, nav pieejamas arī nekādas Intellisense funkcijas. Gan JSON, gan Power Fx ir reģistrjūtīgi, tādēļ īpaši rūpējas par lauku nosaukumu rakstību.

JSON vērtībām nav jābūt ieraksta stila apzīmējumā. Derīgs JSON var būt tikai vērtība, piemēram, "text value", true vai 123.456. Šādā gadījumā Netipēts objekts, ko ParseJSON atgriež, ir pati vērtība, un šī punktu notācija netiek izmantota.

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

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

Visbeidzot, JSON atbalsta ligzdotus ierakstus. Pārvēršot šādu JSON par Netipētu objektu, tiek iegūti ligzdoti objekti, un punktu notāciju var izmantot, lai pārvirzītu hierarhiju.

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

Pārvēršot šo JSON virkni par Netipēta objekta mainīgo ar nosaukumu jsonObject, laukiem var piekļūt, izmantojot punktu notāciju.

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"

Ja nav neviena no punktu notācijas izteiksmes laukiem, tiek atgriezta vērtība Blank().

Masīvi un tabulas

JSON var saturēt vērtību vai ierakstu masīvus. Šiem masīviem var piekļūt tieši vai pārvērst tos Power Fx tabulās.

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

Šajā JSON ir ieraksts ar lauku, kura nosaukums irOrderLines , kas ietver ierakstu masīvu. Katram ierakstam ir divi lauki: Item un Quantity. Ja JSON tiek pārvērsts par Netipētu objektu, izmantojot ParseJSON funkciju un iestatīts uz mainīgo, kura nosaukums ir jsonOrder, mēs atsevišķām pasūtījumu līnijām varam piekļūt vairākos veidos.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Jūs varat izgūt atsevišķus ierakstus un vērtības, izmantojot Index() funkciju. Piemēram, lai laukā OrderLines iegūtu otro ierakstu, pēc tam piekļūtu laukam Quantity un pārvērstu to par vērtību.

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

Pasūtījuma rindu masīvu var pārvērst tieši par tabulu. Tiks izveidota vienas kolonnas tabula ar Netipētu objektu, kas atspoguļo ierakstu.

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

Vienas kolonnas tabulai 'orderLines' tagad ir kolonna 'Value', kas apzīmē Netipētu objektu. Lai izmantotu jebkuru no šīs tabulas ieraksta laukiem, izmantojiet punktu notāciju, lai piekļūtu konkrētam JSON laukam Netipētā objektā, kas iekļauts Value kolonnā.

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

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

Lai atvieglotu pasūtījuma rindu ierakstu izmantošanu un to padarītu tiešāku citās jūsu programmas daļās, jūs varat visu Netipēto objektu konvertēt par pilnībā tipētu ierakstu, izmantojot ForAll() funkciju. Ievadot Netipētu objektu tieši ForAll() funkcijā, objekta laukam varēsiet piekļūt tieši, nevis izmantojot vienas kolonnas Value lauku.

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

Jaunais mainīgais typedOrderLines tagad ir pilnībā ievadīts Power Fx tabulā ar šādām kolonnām un vērtībām:

Vienums Daudzums
"Widget 1" 3
"Widget 2" 5

Iepriekšējie piemēri izmanto ierakstu masīvus, bet JSON var saturēt arī tikai vērtību masīvus. Izskatiet tālāk minēto piemēru, kas ir derīga JSON virkne, kurā ir trīs virkņu masīvs.

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

Mēs varam izgūt vienu no masīva elementiem, izmantojot funkciju Index(), un pārvērst to par tekstu.

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