このトピックでは、JSON (JavaScript Object Notation) 文字列に対応する EGL レコードについて説明します。 その他のトピックでは、サード・パーティー REST サービスにアクセスする場合などに 必要とされる、JSON データと変数の間の変換のために Rich UI 開発者が使用する serviceLib.convertFromJSON() 関数および serviceLib.convertToJSON() 関数について説明します。このいずれの関数で障害が発生した場合も、RuntimeException になります。
{ "EmpNo":10,"LastName":"Smith" }
Record MyRecordPart
EmpNo INT;
LastName STRING;
end
BLOB または CLOB 以外の任意のプリミティブ型を使用できます。 EGL レコード・フィールドについても、このフィールドが DataItem パーツに基づいていて、さらにその DataItem パーツが、サポートしているプリミティブ型のいずれかに基づいている場合であれば、有効です。
{ "Emp-No":10,"LastName":"Smith" }
Record MyRecordPart
EmpNo INT; {JSONName = "Emp-No"}
LastName STRING;
end
(レコード・パーツに基づくレコードを宣言するときに、JSONName の値をオーバーライドすることはできません。)
{"Result":{"aTimestamp":1191871152}}
一般的な規則では、JSON 文字列内の大括弧で囲まれている各節は、EGL レコードに等価である実行時 JSON オブジェクトの内容です。
Record MyTopPart
Result MyTimestampPart;
end
Record MyTimestampPart
aTimestamp BIGINT;
end
示されているように、各 JSON 識別子 (コロンの前に位置します) は、レコード内にフィールドが存在することを必要とします。JSON フィールド名は EGL の予約語語 (例えば、「TimeStamp」) で、レコードではなく辞書を使用して serviceLib.convertFromJSON() または serviceLib.convertToJSON() にアクセスする必要があります。このバリエーションについては、この後このトピックで示します。
{"Menu":
{ "id": "file", "value": "File", "popup":
{"Menuitem":
[
{"value": "New", "onClick": "CreateNewDoc()"},
{"value": "Open", "onClick": "OpenDoc()"},
{"value": "Close", "onClick": "CloseDoc()"}
]
}
}
}
(本ヘルプの作成時点で、上記例およびその他の例は、http://json.org/example.html で公開されています)。
Record MyTopPart
Menu MyMenuPart;
end
Record MyMenuPart
id STRING;
value STRING;
popup MyPopupPart;
end
Record MyPopupPart
MenuItem MyElementPart[];
end
Record MyElementPart
value STRING;
onClick STRING;
end
JSON 文字列にアクセスするときのレコードの使用法をさらに検討するには、Rich UI のサンプル geocode.records を参照してください。
myRef Dictionary
{
ID = 5,
lastName = "Twain",
firstName = "Mark"
};
EGL ヘルプ・システムの『Dictionary パーツ』および関連するトピックで説明されているように、辞書と対話します。
{"Result":{"aTimestamp":1191871152}}
myTime Dictionary;
一般的な規則では、JSON 文字列内の大括弧で囲まれている文節は EGL 辞書に等価です。本ヘルプの JSON 文字列の例に関しては、関数 serviceLib.convertFromJSON() により、最初のコロン (:) の左側の記号は辞書エントリーのキーとして取り扱われます。キーは「Result」で、大/小文字が区別がされます。ここで、(すべてのケースで同じですが)、コロンの右の内容は、名前がコロンの左にあるキーに関連付けられている値です。
myTime Dictionary
{
Result = new Dictionary{ aTimestamp = 1191871152 }
};
numberOfSeconds BIGINT = myTime.Result.aTimestamp;
{"Result":{"Timestamp":1191871152}}
numberOfSeconds BIGINT = myTime.Result["Timestamp"];
{"Menu":
{ "id": "file", "value": "File", "popup":
{"Menuitem":
[
{"value": "New", "onClick": "CreateNewDoc()"},
{"value": "Open", "onClick": "OpenDoc()"},
{"value": "Close", "onClick": "CloseDoc()"}
]
}
}
}
この例では、辞書は、キーが Menu という名前の単一のエントリーを持ちます。このキーに関連付けられている値は、文字列「id」とそれに続くすべての文字列が内側に埋め込まれている大括弧で示されるように、無名辞書です。無名辞書には、キーの ID、値、およびポップアップが、キーの値とともに含まれます。ポップアップと呼ばれるキーにより若干の複雑さが導入されますが、そのような問題についても処理できます。これらの関連は、例の JSON 文字列で確認できます。
ここで、「関数 serviceLib.convertFromJSON() により直前の JSON 文字列が myMenu と呼ばれる辞書にコピーされているものとして、文字列「OpenDoc()」にアクセスするために必要なステートメントは何か」について検討します。
myString STRING = myMenu.Menu.popup.MenuItem[2].onClick;
myMenu Dictionary
{ Menu = new Dictionary
{ id = "file",
value = "File",
popup = new Dictionary
{ MenuItem = new Dictionary[]
{ new dictionary {value = "New", onClick = "CreateNewDoc()" },
new dictionary {value = "Open", onClick = "OpenDoc()" },
new dictionary {value = "Close", onClick = "CloseDoc()"}
}
}
}
};
JSON 文字列にアクセスするときの辞書レコードの使用法をさらに検討するには、Rich UI のサンプル geocode.dictionaries を参照してください。
{"Result":{"Timestamp":1191871152}}
Record ResultRecordPart
Result Dictionary;
end
myResult ResultRecordPart;
milliseconds BIGINT;
serviceLib.convertFromJSON(resp.body, myResult);
milliseconds = myResult.Result["Timestamp"] as BIGINT;
{"Menu":
{ "id": "file", "value": "File", "popup":
{"Menuitem":
[
{"value": "New", "onClick": "CreateNewDoc()"},
{"value": "Open", "onClick": "OpenDoc()"},
{"value": "Close", "onClick": "CloseDoc()"}
]
}
}
}
Record MyTopPart
Menu MyMenuPart;
end
Record MyMenuPart
id STRING;
value STRING;
popup Dictionary;
end
popup Dictionary
{ MenuItem = new Dictionary[]
{ new Dictionary {value = "New", onClick = "CreateNewDoc()" },
new Dictionary {value = "Open", onClick = "OpenDoc()" },
new Dictionary {value = "Close", onClick = "CloseDoc()"}
}
}
(上記辞書は、説明のために示しています。Dictionary の副構造は serviceLib.convertToJSON() の呼び出し時には役立つ可能性がありますが、serviceLib.convertFromJSON() の呼び出し時には使用しません。)
myTop MyTopPart;
itemString STRING;
serviceLib.convertFromJSON(resp.body, myTop);
itemString = myTop.Menu.popup.MenuItem[2].onClick;