Споделяне чрез


Работа с JSON в Power Fx

Power Fx позволява на производителите да четат JSON в Нетипизиран обект използвайки ParseJSON функция.

Четене и конвертиране на стойности

ParseJSON ще преобразува следния низ от JSON запис в нетипизиран обект с полета ItemName, Quantity,, ReleaseDate и AvailableForPreOrder.

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

Всяко от полетата може да бъде достъпно с помощта на нотацията с точка на Нетипизиран обект стойността, върната от 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 ) );

Като цяло е добра идея изрично да преобразувате стойността на нетипизиран обект в определен тип. Задаването на нетипизиран обект като стойност на променлива прави променливата нетипизиран обект също. Така че вероятно е необходимо изрично преобразуване на такава стойност при настройка на променлива. Но в повечето случаи стойностите на нетипизиран обект автоматично ще се преобразуват в определен тип ("принуда"), когато се използват като параметри на функцията, където типът е прост тип като булев, число или текст и профилът на параметрите на функцията няма потенциални конфликтни претоварвания.

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

В допълнение към автоматичното преобразуване на типа в извиквания на функции, нетипизираните обекти също ще бъдат преобразувани, когато са присвоени на свойства на контролата, където е възможно.

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

И накрая, когато се използват оператори като & или +, нетипизиран обект ще бъде принуден, ако няма двусмислие относно очаквания тип.

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

Бележка

JSON няма тип GUID , цвят, часили дата и час . Тези стойности се представят като низ. Ако присвоите стойност на JSONнетипизиран обект, съдържаща дата, директно на текстово свойство, ще се използва оригиналният текст на JSON . Това може да е важно, когато става въпрос за часови зони, формати на датата и т.н. В такива случаи трябва изрично да конвертирате стойностите с помощта на GUID(), ColorValue(), DateValue(), DateTimeValue() и т.н.

В случай че име на поле се състои от невалидно име на идентификатор, например когато имената на полетата започват с число или съдържат невалидни знаци като тире, можете да поставите имената на полетата в единични кавички:

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

Power Fx няма да оцени съществуването на полето, докато формулата не бъде изпълнена. Това позволява гъвкавост във входящия JSON. Например предишният JSON може понякога да съдържа допълнително поле, наречено Discount. Но в нашия предишен пример това поле не присъства. Писането на формула, която използва полето Discount, няма да доведе до никакви грешки по време на процеса на създаване на приложението или когато потребителите използват приложението. Ако полето липсва, когато формулата се изпълнява, стойността просто ще доведе до Blank() стойност.

Бележка

JSON поддържа null стойности за полета. Това също ще доведе до Blank() стойности. Понастоящем няма разлика Power Fx между липсващо поле или поле, което има стойност null.

Тъй като достъпът до полета на Нетипизирани обекти не се оценява при писане на формулата, също не е наличен Intellisense. И JSON и Power Fx са чувствителни към главни и малки букви, така че бъдете особено внимателни при изписването на имена на полета.

Стойностите на JSON не трябва да са в запис в стил запис. Валидният JSON може да бъде просто стойност, като например "text value", true или 123.456. В такъв случай Нетипизираният обект който ParseJSON връща, е самата стойност, а нотацията с точка не е използвани.

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

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

И накрая, JSON поддържа вложени записи. Преобразуването на такъв JSON в Нетипизиран обект води до вложени обекти и нотацията с точка може да се използва за преминаване през йерархията.

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

Когато преобразувате този JSON низ в Нетипизиран обект променлива с име jsonObject, полетата могат да бъде достъпен чрез нотация с точка.

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"

Ако някое от полетата в израза за нотация с точка не съществува, Blank() ще бъде върнат.

Масиви и таблици

JSON може да съдържа масиви от стойности или записи. Тези масиви могат да бъдат достъпни директно или преобразувани в Power Fx таблици.

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

Този JSON съдържа запис с поле с име OrderLines, което съдържа масив от записи. Всеки запис има две полета: Item и Quantity. Ако JSON се преобразува в Нетипизиран обект с помощта на ParseJSON функция и зададена на променлива с име jsonOrder, можем да имаме достъп до отделните редове за поръчка по няколко начина.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Можете да извлечете отделни записи и стойности, като използвате функцията Index(). Например, за да получите втория запис в полето OrderLines, след това отворете полето Quantity и го преобразувайте в стойност.

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

Можете да конвертирате масива от редове за поръчки директно в таблица. Това ще създаде таблица с една колона с Нетипизиран обект представляващ записа.

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

Таблицата с една колона 'orderLines' вече има колона 'Value', която представлява Нетипизиран обект. За да използвате някое от полетата от запис в тази таблица, използвайте нотацията с точка за достъп до конкретното JSON поле на Нетипизиран обект в колоната Value.

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

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

За да направите използването на записите на реда за поръчка по-лесно и по-ясно в други части на вашето приложение, можете да конвертирате целия Нетипизиран обект в изцяло въведен запис, като използвате ForAll() функция. Предоставянето на Нетипизиран обект директно на ForAll() означава, че можете да получите директен достъп до полетата на обекта, вместо да използвате единична колона Value поле.

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

Новата променлива typedOrderLines вече е напълно въведена Power Fx таблица със следните колони и стойности:

Елемент Количество
"Графичен компонент 1" 3
"Графичен компонент 2" 5

Предишните примери използват масиви от записи, но JSON може също да съдържа масиви само от стойности. Помислете за следния пример, който е валиден JSON низ, съдържащ масив от три низа.

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

Можем да извлечем един от елементите от масива с помощта на Index() функцията и да го преобразуваме в текст.

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