Power Fx での JSON の使用

Power Fx は、メーカーが ParseJSON 関数を使用して、JSON型指定されていないオブジェクト へと読めるようにします。

値の読み取りと変換

ParseJSON は以下の JSON レコード文字列を ItemNameQuantityReleaseDateAvailableForPreOrder フィールドを持つ 型指定されていないオブジェクト へと変換します。

{
  "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時間、または DateTime 型がありません。 これらの値は文字列として表されます。 日付を含む JSON の型指定されていないオブジェクト値をテキスト プロパティに直接割り当てる場合、元のテキストの JSON が使用されます。 これは、タイム ゾーンや日付形式などを扱う場合に重要になる場合があります。そのような場合は、GUID()ColorValue()DateValue()DateTimeValue() などを使用して値を明示的に変換する必要があります。

フィールド名が無効な識別子名で構成されている場合 (たとえば、フィールド名が数字で始まっている場合や、ハイフンなどの無効な文字が含まれている場合)、フィールド名を一重引用符で囲むことができます。

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

Power Fx が実行されるまで、フィールドの存在を評価しません。 これにより、JSON の着信の柔軟性が向上します。 たとえば、以前の JSON は、Discount と呼ばれる追加のフィールドが含まれることがあります。 しかし、前の例では、このフィールドは存在しません。 Discount フィールドを使った式を書くことは、アプリの作成プロセス中またはユーザーがアプリを使用するときに、エラーにはなりません。 数式の実行時にフィールドが欠落している場合、この値は単に Blank() 価値の結果です。

Note

JSON はフィールドの null の値をサポートします。 これらはまた、Blank() 値の結果です。 現在、Power Fx で、欠落しているフィールド、または null の値を持つフィールドとの間の区別はありません。

型指定されていないオブジェクト フィールドへのアクセスとしては、式を書くときに評価されないので、利用可能な Intellisense もありません。 JSONPower 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 と言う名前のフィールドをを持つ配列が含まれています。 各レコードには ItemQuantity の 2 つのフィールドがあります。 もし JSONParseJSON を使用して 型指定されていないオブジェクト に変換され、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 列の 型指定されていないオブジェクト の特定の JSON フィールドにアクセスします。

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 テーブルになりました。

Item 品質
"Widget 1" 3
"Widget 2" 5

前の例ではレコードの配列を使用していますが、JSON は値だけの配列を含めることもできます。 3 つの文字列の配列を含む有効な JSON 文字列の例を考えてみましょう。

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

索引() 関数を使用して配列から項目の 1 つを取得し、それをテキストに変換できます。

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