Llegeix en anglès

Comparteix a través de


Treballar amb JSON a Power Fx

Power Fx permet als creadors llegir JSON en un objecte sense tipus amb la funció ParseJSON.

Llegir i convertir valors

ParseJSON convertirà la següent cadena de registre JSON en un objecte sense tipus fields ItemName, Quantity, ReleaseDate and AvailableForPreOrder.

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

Es pot accedir a cadascun dels camps mitjançant la notació de punts del valor d'Objecte sense tipus retornat des de 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 ) );

En general, és una bona idea convertir explícitament el valor d'un objecte sense tipus en un tipus específic. Establint un objecte sense tipus com a valor de variable fa que la variable sigui un objecte sense tipus . Per tant, és probable que sigui necessari convertir aquest valor explícitament quan s'estableix en una variable. Però en la majoria dels casos, els valors d'objecte sense tipus es convertiran automàticament en un tipus específic ("coaccionar") quan s'utilitzen com a paràmetres de funció on el tipus és un tipus simple com booleà, nombre o text, i el perfil de paràmetres de la funció no té possibles sobrecàrregues conflictives.

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

A més de convertir automàticament el tipus en les crides de funció, els objectes sense tipus també es convertiran quan s'assignin a les propietats de control, sempre que sigui possible.

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

I, finalment, quan s'utilitzen operadors com & or +, un objecte sense tipus serà coaccionat si no hi ha ambigüitat sobre el tipus esperat.

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

Nota

JSON no té cap tipus GUID, Color, Time o DateTime . Aquests valors es representen com una cadena. Si assigneu un valor d'objecte sense tipus JSON que conté una data directament a una propietat text, s'utilitzarà el text original del JSON . Això pot ser important quan es tracta de zones horàries, formats de data, etc. En aquests casos, hauríeu de convertir explícitament els valors utilitzant GUID(), ColorValue(), DateValue(), DateTimeValue(), etc.

En cas que un nom de camp consisteixi en un nom d'identificador no vàlid, per exemple, quan els noms dels camps comencen per un número o contenen caràcters no vàlids, com ara un guionet, podeu col·locar els noms dels camps entre cometes simples:

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

Power Fx no avaluarà l'existència del camp fins que s'executi la fórmula. Això ofereix flexibilitat en el JSON entrant. Per exemple, el JSON anterior pot contenir de vegades un camp addicional anomenat Discount. Però al nostre exemple anterior aquest camp no està present. Escriure una fórmula que utilitzi el camp Discount no causarà errors, durant el procés de creació de l'aplicació o quan els usuaris utilitzin l'aplicació. Si falta el camp quan s'executa la fórmula, el valor tindrà un valor Blank().

Nota

JSON admet null valors per als camps. Això també donarà valors Blank(). Actualment no hi ha cap diferència al Power Fx entre un camp que falta i un camp que té el valor null.

Com que l'accés als camps Objectes sense tipus no s'avalua quan s'escriu la fórmula, tampoc no hi ha disponible Intellisense. Tant JSON com Power Fx distingeixen les majúscules de les minúscules, per tant, aneu amb compte quan escriviu noms de camp.

Els valors JSON no han d'estar en una notació d'estil de registre. Un JSON vàlid pot ser només un valor, com ara "text value", true o 123.456. En aquest cas, l'Objecte sense tipus que torna ParseJSON retorna el mateix valor i la notació de punts no s'utilitza.

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

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

Finalment, JSON admet registres imbricats. La conversió d'aquest JSON a Objecte sense tipus dona objectes imbricats, i la notació de punts es pot utilitzar per travessar la jerarquia.

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

Quan convertiu aquesta cadena JSONen una variable d'Objecte sense tipus anomenada jsonObject, es pot accedir als camps mitjançant la notació de punts.

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"

Si no existeix cap dels camps de l'expressió de la notació de punts, es retornarà Blank().

Matrius i taules

JSON pot contenir matrius de valors o registres. Es pot accedir a aquestes matrius directament o convertir-les en taules del Power Fx.

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

Aquest JSON conté un registre amb un camp anomenat OrderLines que conté una matriu de registres. Cada registre té dos camps: Item i Quantity. Si el JSON es converteix en un Objecte sense tipus amb la funció ParseJSON i es defineix com una variable anomenada,jsonOrder, podem accedir a les línies d'ordre individuals de diverses maneres.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Podeu recuperar registres i valors individuals utilitzant la funció Index(). Per exemple, per obtenir el segon registre al camp OrderLines, accediu al camp Quantity i convertiu-lo en un valor.

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

Podeu convertir la matriu de línies de comanda directament en una taula. Es crearà una taula d'una sola columna amb un Objecte sense tipus que representi el registre.

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

Una taula de columnes 'orderLines' té ara una columna 'Valor' que representa l'Objecte sense tipus. Per utilitzar qualsevol dels camps d'un registre d'aquesta taula, utilitzeu la notació de punts per accedir al camp JSON específic de l'Objecte sense tipus de la columna Value.

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

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

Per fer que l'ús dels registres de línia de comanda sigui més senzill i directe a altres parts de l'aplicació, podeu convertir tot l'Objecte sense tipus en un registre completament amb tipus utilitzant la funció ForAll(). Proporcionar l'objecte sense tipus directament a ForAll() significa que podeu accedir als camps d'objecte directament en comptes d'utilitzar el camp d'una columna Value.

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

La variable typedOrderLines nova és ara una taula Power Fx totalment de tipus amb les columnes i els valors següents:

Element Quantitat
"Giny 1" 3
"Giny 2" 5

Els exemples anteriors utilitzen matrius de registres, però JSON també pot contenir matrius de només valors. Considereu l'exemple següent, que és una cadena JSON vàlida que conté una matriu de tres cadenes.

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

Podem recuperar un dels elements de la matriu utilitzant la funció Index() i convertir-la en text.

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