GeneXus で JSON を利用する最も簡単な方法の 1 つに、構造化データタイプ (SDT) の使用があります。
そのためには、SDT で JSON の構造を宣言し、そのためには、SDT で JSON の構造を宣言し、その SDT FromJson メソッドを使用してコンテンツを JSON 文字列から SDT 形式に変更します。
例:
&SDT.FromJson( jsonString )
JSON の特定のオブジェクトのプロパティが変数である場合、問題が発生する可能性があります。変数の濃度が高い場合は、状況がより悪くなることがあります。
たとえば、CryptoCompare API を使用すると、コインが次のように公開されます:
何千ものコインが存在し、何千ものエレメントを 1 つの SDT で扱うことになるため、 [ Data ] プロパティのすべてのエレメントを宣言することは事実上不可能です。さらに、新しい通貨が登場したときに、SDT 構造にその宣言が含まれていないことになります。
このようなケースでは、Properties データタイプを使用してこの構造を解析します。
概念的には、Property データタイプによって辞書が構築されます。これはまさに JSON です。
JSON オブジェクトは基本的には {} 区切りの辞書です。したがって、Properties オブジェクトによって完全に表すことができます。
[ ] で区切られた JSON 配列の場合は、 [ Collection ] プロパティを True に設定して Properties データタイプを使用します。
この JSON を解析するには、次のように記述するだけです:
&Properties.FromJson(&jsonString) //Properties は Properties データタイプ
その後、次のようにして任意のプロパティの値を確認できます:
&Properties.Get(!"Response") //上記の例では Success を返す
代わりに、次のような別の JSON 形式の文字列を返す [ Data ] プロパティを要求することもできます:
{
"LTC": {
"Id": "3808",
"Url": "/coins/ltc/overview",
"ImageUrl": "/media/19782/ltc.png",
"Name": "LTC",
"CoinName": "Litecoin",
"FullName": "Litecoin (LTC)",
"Algorithm": "Scrypt",
"ProofType": "PoW",
"SortOrder": "2"
},
“BTC” : { … },
...
},
この場合も、値を Properties タイプの変数に変換できます:
&CoinsProperties.FromJson(&dataString) //&CoinsProperties は Properties データタイプ
辞書のエレメントを順番に処理するために、次のように記述します:
For &Coin in &CoinProperties //&Coin は Property データタイプ
msg(&Coin.Key) //LTC、BTC、... のように順番に出力する
msg(&Coin.Value)
EndFor
したがって、Properties データタイプを使用して JSON を解析する場合、最終的に次のようになります:
if &CoinsListProperties.Get(!"Response") = !"Success"
&CoinProperties.FromJson(&CoinsListProperties.Get(!"Data"))
for &Coin in &CoinProperties
&CoinDataStructure.FromJson(&Coin.Value)
&CoinDataStructureCollection.Add(&CoinDataStructure)
&CoinDataStructure = new()
endfor
else
msg(!"Failed to retrieve the information.")
endif
注: コインのデータ構造は SDT で次のように表すことができます:
サンプルはこちらからダウンロードできます。
Web パネル SampleJsonConsumer を実行し、次の JSON を入力します:
{
"Response": "Success",
"Message": "Coin list succesfully returned!",
"BaseImageUrl": "https://www.cryptocompare.com",
"BaseLinkUrl": "https://www.cryptocompare.com",
"Data": {
"LTC": {
"Id": "3808",
"Url": "/coins/ltc/overview",
"ImageUrl": "/media/19782/ltc.png",
"Name": "LTC",
"CoinName": "Litecoin",
"FullName": "Litecoin (LTC)",
"Algorithm": "Scrypt",
"ProofType": "PoW",
"SortOrder": "2"
},
"IN": {
"Id": 0,
"Url": "/coins/in/overview",
"ImageUrl": "/media/1381987/in.png",
"Name": "IN",
"CoinName": "InCoin",
"FullName": "InCoin (IN)",
"Algorithm": "X11",
"ProofType": "PoW/PoS",
"SortOrder": 988
},
"AURS": {
"Id": 0,
"Url": "/coins/aurs/overview",
"ImageUrl": "/media/12318345/aurs.png",
"Name": "AURS",
"CoinName": "Aureus",
"FullName": "Aureus (AURS)",
"Algorithm": "Scrypt",
"ProofType": "N/A",
"SortOrder": 1711
}
},
"Type": 100
}
結果を確認してください。
次に、いくつかの標準的な例を示します。
この JSON で、すべての生徒名を出力するとします。
{
"Students": [
{
"Name": "Amit Goenka",
"Major": "Physics"
},
{
"Name": "Smita Pallod",
"Major": "Chemistry"
},
{
"Name": "Rajeev Sen",
"Major": "Mathematics"
}
]
}
GeneXus コードは次のとおりです:
&Properties.FromJson(&json)
&StudentsProperties.FromJson(&Properties.Get(!"Students"))
For &StudentProperties in &StudentsProperties
msg(&StudentProperties.Get(!"Name"))
Endfor
ここで、&StudentProperties と &StudentsProperties は Properties として定義されますが、後のものは [ Collection ] プロパティが True に設定されています。
出力:
Amit Goenka
Smita Pallod
Rajeev Sen
次の例は JSON 配列です ( [ で開始し、 ] で終了)。
[ { "Name": "Amit Goenka", "Major": "Physics" }, { "Name": "Smita Pallod", "Major": "Chemistry" }, { "Name": "Rajeev Sen", "Major": "Mathematics" } ]
コレクション内に生徒の名前を出力する GeneXus コードは次のとおりです:
&PropertiesCollection.FromJson(&json)
For &StudentProperties in &PropertiesCollection
msg(&StudentProperties.Get(!"Name"))
endfor
&PropertiesCollection は Properties データタイプとして定義され、 [ Collection ] プロパティは True に設定されます。&StudentProperties は Properties データタイプとしてのみ定義されます。
出力:
Amit Goenka
Smita Pallod
Rajeev Sen
|