Рад са ЈСОН-ом у Power Fx
Power Fx омогућава ауторима да учитају JSON у нетипизирани објекат помоћу функције ParseJSON.
Читање и конвертовање вредности
ПарсеЈСОН ће претворити следећи ЈСОН рекордни низ у < ДИЦТ__нетипизирани објекат > Унтyпед објецт са пољима 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 ) );
Генерално је добар идеја експлицитно претворити вредност < ДИЦТ__нетипизирани објекат > Унтyпед објецт у одређени тип. Постављање < ДИЦТ__нетипизирани објекат > Унтyпед објецт као вредности променљиве чини променљиву ан < ДИЦТ__нетипизирани објекат > Унтyпед објецт алсо. Дакле, вероватно је потребно претварање такве вредности експлицитно приликом подешавања на променљиву. Али у већини случајева < ДИЦТ__нетипизирани објекат > Унтyпед објецт вредности ће се аутоматски претворити у одређени тип ("принуда") када се користе као параметри функције где је тип једноставан тип као што је боолеан, број или текст, а профил параметара функције нема потенцијална конфликтна преоптерећења.
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
И на крају, када се користе оператори као што су < ДИЦТ__нетипизирани објекат > Унтyпед објецт +, анће бити приморани ако не постоји двосмисленост о очекиваном типу.
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
Белешка
ЈСОН нема тип ГУИД , Цолор , Тиме или ДатеТиме . Ове вредности су представљене као стринг. Ако директно доделите ЈСОН < ДИЦТ__нетипизирани објекат > Унтyпед објецт вредност која садржи датум текстуалној особини, оригинални текст ЈСОН-а ће се користити. Ово може бити важно када се ради о временским зонама, форматима датума итд. У таквим случајевима треба експлицитно конвертовати вредности користећи ГУИД() , ЦолорВалуе() , ДатеВалуе() , ДатеТимеВалуе() , итд.
У случају да се име поља састоји од неважећег имена идентификатора, на пример, када имена поља почињу бројем или садрже неважеће знакове као што је цртица, имена поља можете да ставите у једноструке наводнике:
untyped.'01'
untyped.'my-field'
Power Fx неће процењивати постојање поља док се формула не покрене. То омогућава флексибилност за долазећи JSON. На пример, претходни JSON понекад може да садржи додатно поље које се зове Discount
. Али у нашем претходном примеру, ово поље није присутно. Писање формуле која користи поље Discount
неће довести до грешака, током процеса прављења апликација или када корисници користе апликацију. Ако поље недостаје када се покрене формула, вредност ће само довести до вредности Blank().
Белешка
ЈСОН подржава null
вредности за поља. То ће такође резултирати празним вредностима Blank(). Тренутно не постоји разлика између Power Fx поља које недостаје или поља које има вредност null
.
Како се приступ пољима на нетипизираним објектима не процењује приликом писања формуле, технологија Intellisense такође није доступна. И JSON и Power Fx су осетљиви на мала и велика слова, зато додатно водите рачуна о писању имена поља.
ЈСОН вредности не морају бити у нотацији у стилу записа. Важећи 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().
Низови и табеле
ЈСОН може да садржи низове вредности или записа. Тим низовима се може приступити директно или конвертовати у 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"