より複雑なデータ
プロデルでJSON形式を扱う方法実践編。基本編はこちら。
JSON形式は、入れ子を使うことができ、より複雑なデータも扱うことができる。例えば、こんな感じ。「item」の中にりんごに関するデータと机に関するデータが入っており、アイテムたる林檎や机には、それぞれナンバーが振られている(というか、振った)。
{"item":[
{
"ID":1,
"ItemName":"りんご",
"Type":"食べ物"
},
{
"ID":2,
"ItemName":"机",
"Type":"家具"
}
]}
さて、こういう形のデータをプログラム内で書き、それをJSON形式ではない、通常の辞書型にしたい場合、プロデルの場合は、少し注意がいる。このまま基礎編のやり方にこのデータをコピー&ペーストしても、エラーが出てしまう。
具体的には、一行目、{“item”:[、とある部分の最後の「[」を[]で囲む。公式マニュアルのサンプルでは、末尾の]についても[]]と囲う形で書かれているが、末尾の方は、囲み忘れても通る模様(ver.1.8.1150)。
さて、上記のデータを変数「アイテム」に読み込むには、下記のようになる。
アイテムは、JSON形式:「{"item":[[]
{
"ID":1,
"ItemName":"りんご",
"Type":"食べ物"
},
{
"ID":2,
"ItemName":"机",
"Type":"家具"
}
]}」を読み取る
アイテムを報告する
ややこしく見えるが、
JSON形式:「」を読み取る
という基本形から、変わっていない。後は、[を[]で囲むのを忘れなければOK。
・・・とここまで書いておいてなんだが、JSON形式のデータを一旦変数に入れておけば、実はすっきりと書ける(このページ最後の方に掲載)。
さて、こうして変数「アイテム」に投入されたデータは、次のようになる。
item={ID=1\nItemName=りんご\nType=食べ物,ID=2\nItemName=机\nType=家具}
辞書型になったデータを覗いてみる
さて、無事辞書型の変数「item」に入ったデータだが、良く分からないな、と感じるようであれば、アイテム(「item」)を報告させると、分かりやすくなる(多分)。itemがkey、残りがvalueに入っている。
更に、これを配列に放り込んでみる。変数「箱」を作り・・・
箱=アイテム(「item」)
箱(1)を報告する
とすると、結果は次のようになる。
ID=1
ItemName=りんご
Type=食べ物
箱(2)には、
ID=2
ItemName=机
Type=家具
(あくまで中身を把握しやすくするための作業なので、使えなくてもご容赦を)
JSON形式で保存する
辞書型の変数「アイテム」のデータをJSON形式にし、ファイルに保存する
セーブ用=アイテムをJSON形式として書き出す
セーブ用を「test.json」に「UTF-8」で保存する
上記では、変数に入れているが、入れずに下記のような書き方でも行ける。
アイテムをJSON形式として書き出したものを「test.json」に「UTF-8」で保存する
これで、「test.json」に文字コードUTF-8でデータが保存される。文字コードを指定せず、「test.json」に保存する、としても、プロデルのみで使っている分には、一応動く。ただ、JSONの文字コードは、「UTF-8」と定められているようなので、UTF-8で保存した方がいい。特に指定しない場合は、プロデルの場合、Shift-JISで保存される模様。
この書き方で保存した場合、データファイルは、人間には少々見づらいものになる。
{"item":[{"Type":"食べ物","ItemName":"りんご","ID":1},{"Type":"家具","ItemName":"机","ID":2}]}
タブ等を入れた、「より人間に見やすい」形にしたい場合は、「JSON形式として整形して書き出す」といったように、「整形して」を挿入すればいい。セーブファイル内は、下記のようになる。
{
"item": [
{
"Type": "食べ物",
"ItemName": "りんご",
"ID": 1
},{
"Type": "家具",
"ItemName": "机",
"ID": 2
}
]
}
JSON形式ファイルを読み込む
ファイルに保存してあるJSON形式データを読み込む方法。
テストは、「test.json」から読み込む
テストを報告する
テストの種類名を報告する
テスト2は、JSON形式:テストを読み取る
テスト2を報告する
変数テストに「test.json」を読み込む。テストは、この時、文字列。そのままずらずらと取り込まれているので、これを変数「テスト2」に辞書型として取り込む。
「読み取る」作業は同じなのに、酷くシンプルに見えるのは、JSON形式データが既に変数に格納されているから。
さて、後は、煮るなり焼くなりご随意に。