processingからjsonを解析した
こんにちは、かささぎです。就活とかテストとか一段落して、急に暇になって虚無感がつのっています。
今回はProcessingでJSONを触ります。私のブログのアクセス数がトップの記事はこちらの記事で、javaでJSONを利用するものです。アクセスの半分くらいがこれなので、試しにエゴサしてみたところ、
「Java JSON」で検索すると、この記事が1ページ目に表示されました。
「Processing JSON」では上位にヒットしませんでした。
そこで、Processing向けのJSON利用について試して、書いていくことにしました。
jsonとは
可読性が高いというメリットがあるデータの形式です。こんな感じのデータです。
{ "items":[ { "name" : "apple", "id" : "A01", "price" : 150}, { "name" : "grape", "id" : "A02", "price" : 300 }, { "name" : "onion", "id" : "B01", "price" : 50 } ] }
以降は、このデータをサンプルとして説明していきます。
Processingでの利用
jsonの解析には一般的にはライブラリを用いますが、ProcessingではJSONObjectというクラスが標準で実装されています。大きなデータの処理などが必要な際はjsonライブラリを利用してもよいですが、今回はライブラリのインポートや利用法を学ぶのがめんどくさいので難しい処理はしないので標準ライブラリを利用します。
- JSONデータの読み込み
読み込みにはloadJSONObject関数を利用します。引数にはファイル名かURLを入れます。
jsonのファイルをdata.jsonとすると、
JSONObject json = loadJSONObject("data.json");
となります。jsonをprintすると、jsonファイルと同じものが表示されます。
- JSON配列の取得
jsonでは、{}で囲まれたものをJSONObject、[]で囲まれたものをJSONArrayと呼びます。JSONArrayでは複数の要素を格納することができます。
JSONArrayの取得にはgetJSONArrayメソッドを用います。今回のデータでは"items"というタグの中のJSONArrayを取得するので、以下のようになります。
JSONArray jarr = json.getJSONArray("items");
これをprintしてみると、以下のようになります。
[ { "price": 150, "name": "apple", "id": "A01" }, { "price": 300, "name": "grape", "id": "A02" }, { "price": 50, "name": "onion", "id": "B01" } ]
- JSONオブジェクトの取得
続いて、{}で囲まれたJSONobjectを取得します。取得にはgetJSONObject関数を用います。引数には要素数を入れます。
例の"apple"が入っているデータを取得する際には、
JSONObject j0 = jarr.getJSONObject(0);
で取得できます。これをprintすると
{ "price": 150, "name": "apple", "id": "A01" }
と表示されます。
- 要素の取得
要素の取得にはgetString関数、getInt関数、getBoolean関数などを利用します。取得する値の型によって使い分ける必要があります。引数にはタグをString型で入れます。
String name = j0.getString("name"); int price = j0.getInt("price");
以上でProcessingでのJSONの解析ができました。
WebAPIを利用して天気予報を表示
JSON形式は、WebAPIにおいても利用されることが多いです。
そこで今回はJSONでのWebAPIを提供している、Livedoor Weather Web Serviceを利用して、天気予報をProcessingのスケッチに表示するプログラムを作成してみました。
ホームページのAPIの仕様を見ながら作成していきました。
ソースコード・実行結果を以下に載せます。
<ソースコード>
gist95d733118d8f8eadc42a9f17a85d413b
<実行結果>
長いので、解説は簡単にしていきます。
city = ? の?を変えることで、天気予報の都市を設定することできます。
JSONデータの概形の取得はloadJson関数で行いました。URLでの利用は、通信がうまくいかないときのためにtry,catchで例外処理をしておくとよいです。
このAPIにはアイコン画像のデータもあったので、PImage関数でURLを指定して読み込んでみました。
やはり画像をロードするためか、やや実行時間がかかりました。