次の方法で共有


Power Fx での JSON の使用

Power Fx を使用すると、作成者は ParseJSON 関数を使用して JSON動的値に読み取ることができます。

値の読み取りと変換

ParseJSON は、次の JSON レコード文字列を 動的 レコードに変換し、フィールド ItemNameQuantityReleaseDate 、および 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 には GUIDColorTimeDateTime 型がありません。 これらの値は文字列として表されます。 日付を含む 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 も使用できません。 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' 列が追加されました。 このテーブルのレコードのフィールドのいずれかを使用するには、ドット表記を使用して、列の動的値の特定の 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"