Power Fx を使用すると、作成者は ParseJSON 関数を使用して JSON を動的値に読み取ることができます。
値の読み取りと変換
ParseJSON は、次の JSON レコード文字列を 動的 レコードに変換し、フィールド ItemName、 Quantity、 ReleaseDate 、および AvailableForPreOrderします。
{
"ItemName" : "Widget 1",
"Quantity" : 46,
"ReleaseDate" : "2022-09-01",
"AvailableForPreOrder" : true
}
各フィールドには、ParseJSON から返される動的値のドット表記を使用してアクセスできます。
Set( dynvalue, ParseJSON( jsonStringVariable ) );
Set( item, Text ( dynamic.ItemName ) );
Set( quantity, Value ( dynamic.Quantity ) );
Set( release, DateValue ( dynamic.ReleaseDate ) );
Set( preorder, Boolean ( dynamic.AvailableForPreOrder ) );
通常、動的な値を特定の型に明示的に変換することをお勧めします。 動的値を変数値として設定すると、変数も動的な値になります。 そのため、変数に設定するときに、そのような値を明示的に変換する必要がある場合があります。 ただし、ほとんどの場合、動的な値は、型がブール値、数値、テキストなどの単純な型であり、関数のパラメーター プロファイルに競合する可能性のあるオーバーロードがない関数パラメーターとして使用すると、特定の型に自動的に変換されます ("強制")。
Left( dynamic.ItemName, 1 ); // "W"
Radians( dynamic.Quantity ); // 0.80285146
If (dynamic.AvailableForPreOrder, "Available", "Not Available" ); // "Available"
関数呼び出しで型を自動的に変換するだけでなく、可能な場合は、コントロールのプロパティに割り当てられると、動的な値も変換されます。
Label1.Text: dynamic.Quantity
InputText1.Default: dynamic.ItemName
最後に、> や などの+する場合、予期される型にあいまいさがない場合、動的な値が強制されます。
dynamic.Quantity + 1 // result is a number
dynamic.ItemName & " (preorder)" // result is text
dynamic.Quantity + dynamic.Quantity // result is a number
dynamic.Quantity & dynamic.ItemName // result is text
注意Note
JSON には GUID、 Color、 Time 、 DateTime 型がありません。 これらの値は文字列として表されます。 日付を含む JSON 動的値をテキスト プロパティに直接割り当てると、 JSON の元のテキストが使用されます。 これは、タイム ゾーンや日付形式などを扱う場合に重要になる場合があります。そのような場合は、GUID()、ColorValue()、DateValue()、DateTimeValue() などを使用して値を明示的に変換する必要があります。
フィールド名が無効な識別子名で構成されている場合 (たとえば、フィールド名が数字で始まっている場合や、ハイフンなどの無効な文字が含まれている場合)、フィールド名を一重引用符で囲むことができます。
dynamic.'01'
dynamic.'my-field'
Power Fx が実行されるまで、フィールドの存在を評価しません。 これにより、JSON の着信の柔軟性が向上します。 たとえば、以前の JSON は、Discount と呼ばれる追加のフィールドが含まれることがあります。 しかし、前の例では、このフィールドは存在しません。
Discount フィールドを使った式を書くことは、アプリの作成プロセス中またはユーザーがアプリを使用するときに、エラーにはなりません。 数式の実行時にフィールドが欠落している場合、この値は単に Blank() 価値の結果です。
注意Note
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 の 2 つのフィールドがあります。
JSON が ParseJSON 関数を使用して動的値に変換され、jsonOrderという名前の変数に設定されている場合は、複数の方法で個々の注文行にアクセスできます。
Set( jsonOrder, ParseJSON( jsonStringVariable ) );
個々のレコードと Index() 関数を使用した値を取得できます。 たとえば、OrderLines フィールドの 2 番目のレコードを取得するには、Quantity フィールドにアクセスして、それを値に変換します。
Set( line2Quantity, Value( Index( jsonOrder.OrderLines, 2 ).Quantity ) ); // 5
注文明細行の配列をテーブルに直接変換できます。 これにより、レコードを表す 動的 値を持つ単一列テーブルが作成されます。
Set( orderLines, Table( jsonOrder.OrderLines ) );
単一列テーブル 'orderLines' に 、動的 値を表す 'Value' 列が追加されました。 このテーブルのレコードのフィールドのいずれかを使用するには、ドット表記を使用して、列の動的値の特定の Value フィールドにアクセスします。
Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table
Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"
アプリの他の部分で注文明細行レコードをより簡単かつ簡単に使用できるようにするには、ForAll() 関数を使用して、Dynamic 値全体を完全に型指定されたレコードに変換できます。
ForAll() に動的値を直接指定すると、単一列のValue フィールドを使用する代わりに、オブジェクト フィールドに直接アクセスできます。
Set( typedOrderLines, ForAll( jsonOrder.OrderLines, { Item : Text( ThisRecord.Item ), Quantity : Value( ThisRecord.Quantity ) } ) );
新しい typedOrderLines 変数は、次の列と値を持つ完全に入力された Power Fx テーブルになりました。
| Item | 品質 |
|---|---|
| "ウィジェット 1" | 3 |
| "ウィジェット 2" | 5 |
前の例ではレコードの配列を使用していますが、JSON は値だけの配列を含めることもできます。 3 つの文字列の配列を含む有効な JSON 文字列の例を考えてみましょう。
[ "First Item", "Second Item", "Third Item"]
索引() 関数を使用して配列から項目の 1 つを取得し、それをテキストに変換できます。
Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"