JSON 式
このトピックでは、ロボットで使用される JSON 式について説明します。
JSON 式は次の要素で構成されています。
-
数値
-
ブール値
-
文字列
-
定数、null
-
オブジェクト
-
配列
式内に null、オブジェクト、および配列を直接記述するか、オブジェクトと配列内に他のすべての形式を記述することができます。つまり、1 のように単独で記述された数値は Number 型とみなされますが、{"name": "Joe", "age": 42} のようにオブジェクト内に記述された数値は JSON 型であると見なされます。ブール値と文字列の場合も同様です。ただし、数値、ブール値、またはテキストなどの単純型の値を JSON 変数に直接割り当てることは可能です。
JSON 式内では、[x, y+1] や {"a": x*y} などの変数や式を使用できます。つまり、テンプレートとして機能する式から JSON を作成することが可能です。例: {"name": name, "age": age, "title": title}、ここで name、age、および title は変数です。
JSON 式の構文は、通常の式と可能な限り混在させることができます。たとえば、{"a": x > y ? [x, y] : [y, x]} のような式を記述することができ、ここではオブジェクト式の中に条件式があり、条件式の中に配列式があります。
ただし、例外もいくつかあります。JSON 値は、JSON 以外の型の値が想定される位置には表示されません。ただし、数値、整数、テキスト、およびブール値は、JSON 値が想定される場所に常に表示される可能性があります。たとえば、JSON 数値を number に追加することはできません。json が数値を含む JSON 型の変数であり、この変数を整数 5 に追加しようとした場合、変数には常に数値または整数が含まれているとは限らないため、json + 5 と記述することはできません。代わりに、json.integer() + 5 と記述する必要があります。したがって、json 変数の値は整数であると想定していることを記述内で通知します。これが異なっている場合、ロボットは例外をスローします。
次のように、通常の式内で使用できる JSON 式にはさまざまなものがあります。
-
オブジェクト作成式 (例: {}, {"a": 5)
-
配列作成式 (例: [], [1, 2, 3])
-
定数、null
また次のように、JSON 型によって導入される式言語の拡張機能は他にもあります。
-
配列アクセス式 expr[expr]。最初の expr は JSON 型の任意の式で、2 番目の expr は整数式です。
たとえば、式 [1,2,3][1] は 2 と評価されます。配列の要素には 0 ベースのインデックスがあるため、インデックス 1 の要素は配列内の 2 番目の要素になります。
また、最初の expr がオブジェクト値で、2 番目の expr がテキスト値である場合、式はオブジェクトのキーの値にアクセスします。たとえば、式 {"a": 5}["a"] は 5 と評価されます。この形式は、{"a": 5}.a のようなフィールド アクセスと同等ですが、JSON のキーは任意の文字列にすることができるため、フィールド アクセスを使用して JSON オブジェクト内のキーの値にアクセスできない場合があります。たとえば、{"a.b": 5}["a.b"] を使用することはできますが、{"a.b": 5"}.a.b は使用できません。
式のもう 1 つの用途としては、変数の値などのキーが計算される場合が挙げられます。例: {"a": 5}[v] (ここでv はテキスト変数です)。
-
フィールド アクセス式 expr.id。ここで、expr は JSON オブジェクト値に評価される式であり、id はキー (識別子) です。値が JSON オブジェクトでない場合は例外がスローされます。
例: {"a": 5}.a。
-
オブジェクトのオーバーライド式。オブジェクト作成式が JSON タイプの式の後に配置されている場合、オブジェクト作成式内のすべてのキー/値のペアによって JSON 式のキー/値のペアがオーバーライドされます。
例: {"a": 5}{"a": 7, "b": true} は {"a": 7、"b": true と評価されます。
したがって、オブジェクトのオーバーライド式により、キー "a" の値がオーバーライドされ、新しいキー/値のペア "b": true が追加されます。
-
配列オーバーライド式。この式はオブジェクト オーバーライド式に似ていますが、配列内の既存の要素のみがオーバーライドされる点が異なります。
例: [true, false, null][1: 42] は [true, 42, null] と評価され、これにより、配列内のインデックス 1 の要素がオーバーライドされます。
-
オブジェクトをレコードに変換する式。この式は、レコードの対応するフィールドをオーバーライドする JSON オブジェクトのキーの値を使用して、新しいレコード値を作成します。
たとえば、r{json} の場合、r はレコード変数、json は JSON オブジェクトです。この式は、r 内のフィールドの値を JSON オブジェクト内の対応するキーの値でオーバーライドした新しいレコード値を作成します。
-
等価式 == および != は JSON 値で使用できます。2 つのオブジェクトが同じキー/値のペアを持つ場合、これらは等しいとみなされます。表示される順序は重要ではありません。
構文
説明
例
expr[expr]
アクセス
[1,2,3][1] は 2 と評価されます
expr.id
アクセス
{"a": 5}.a は 5 (JSON 値 5) と評価されます
expr == expr
等価
[1,2] == [1,2] は true と評価されます
expr != expr
等しくない
[] != [1,2] は true と評価されます
null
JSON の null データ型
null は null と評価されます
{"id": expr,…}
新しい JSON オブジェクトを作成します
{"a": 5, "b": true}
expr{"id": expr,…}
JSON オブジェクト内のキー/値のペアをオーバーライドまたは追加します
変数 json = {"a": 5、"c": null の場合、json{"a": 7, "b": true} は {"a": 7、"b": true、"c": null と評価されます
expr{expr}
JSON オブジェクト内のキーの値を使用して、レコードの対応するフィールドをオーバーライドし、新しいレコード値を作成します。これは、JSON オブジェクトをレコード値に変換するための簡単な方法です。
JSON オブジェクト内のキーのセットは、Record 型のフィールドのセットのサブセットである必要があります。JSON 値にレコード値のフィールドに対応しないキーが含まれている場合は、エラーがスローされます。JSON オブジェクトに、レコード値内のすべてのフィールドのキーが含まれている必要はありません。
r{json} は R("a": 42)と評価されます (r が R 型で、フィールドが a であり、json が値 {"a": 42} を持つ JSON 変数である場合)
[expr,…]
新しい JSON 配列を作成します
[1, true, null, {}]
expr[expr:expr,…]
JSON 配列内の要素をオーバーライドします
変数 json = [1, true, null] の場合、 json[1:false] は [1, false, null] と評価されます
配列演算子
配列を他の要素と組み合わせて操作する次の二項演算子を使用します。
|
演算子 |
タイプ |
説明 |
例 |
|---|---|---|---|
|
+: |
(T, JSON) -> JSON |
JSON 配列に新しいヘッド要素を追加します。 |
1 +: [2, 3] は [1, 2, 3] と評価されます |
|
:+ |
(JSON,T) -> JSON |
JSON 配列に新しい最後の要素を追加します。 |
[1, 2] :+ 3 は [1, 2, 3] と評価されます |
|
++ |
(JSON,JSON) -> JSON |
2 つの JSON 配列を結合します。 |
[1, 2] ++ [3, 4, 5] は [1, 2, 3, 4, 5] と評価されます |