Java用のシンプルかつ高機能なJSONエンコーダー/デコーダーライブラリであるJSONICの使い方です。
JSONの基本
JSON とは JavaScript Object Notation の略で、構文は JavaScript におけるオブジェクトの表記法をベースとした軽量なデータ記述言語の1つです。JSONは"KEY":"VALUE"
の形式で記述します。KEY として使うデータ型は文字列に限りますので、ダブルクオーテーションで囲む必要があります。シングルクォートは使えません。
JSON オブジェクト
JSON オブジェクトは、波括弧の中に記述します。オブジェクトには、複数のKEY:VALUE
のペアを含めることができます。これは連想配列と等価であり、Ruby ではハッシュ、Java では Map などと呼ばれています。
{"id":1, "name":"tasukujp"}
JSONの値
JSON の値には次の値を使用することができます。true
,false
,null
は全て小文字でなくてはいけません。
- 数値 (整数または浮動小数点)
- 文字列 (ダブルクォーテーションで括る)
- 真偽値 (true または false)
- 配列 (角括弧で括る)
- オブジェクト (波括弧で括る)
- null
JSON配列
JSON 配列は角括弧の中に、ゼロ個以上の値をカンマで区切って記述します。
"test":["hoge", "fuga", "bar"] "user":[{"id":1, "name":"tasukujp"},{"id":2, "name":"yamadajp"},{"id":3, "name":"satojp"}]
JSONICのライブラリ
JSONIC を使用するには公式サイトの JSONIC - simple json encoder/decoder for java から Jar をダウンロードしてクラスパスに追加してください。Maven や Gradle の場合は以下を指定します。
<dependency> <groupId>net.arnx</groupId> <artifactId>jsonic</artifactId> <version>1.3.9</version> </dependency>
Maven Repository: net.arnx » jsonic
compile 'net.arnx:jsonic:1.3.9'
JSONICの使い方
以下の User クラスを元に確認していきます。
POJOからJSONに変換する(Encode)
User オブジェクトを作成して JSON に変換してみましょう。
結果は以下の通りになります。User クラスの変数名がそのまま KEY となっています。Map の場合は KEY:VALUE が そのまま JSON オブジェクトとして出力されていますね。
{"hobby":["running","bouldering","baseball"],"id":1,"interests":["machine learning","app"],"name":"tasukujp","skill":{"Java":true,"Ruby":null}}
JSONからPOJOに変換する(Decode)
今度は逆に JSON を変換して User オブジェクトを作成してみましょう。
結果は以下の通りになります。JSON の KEY と一致する User クラスの変数に変換されています。
id:1 name:tasukujp Hobby:running Hobby:bouldering Interests:machine learning Interests:app skill:{Java=true, Ruby=null}
Decode する場合、JSON の KEY 名と Java オブジェクトの変数名が一致しないと値が格納されません。
"{\"id\":1,\"name\":\"tasukujp\",\"hobbyTest\":[\"running\",\"bouldering\"],\"interestsTest\":[\"machine learning\",\"app\"],\"skillTest\":{\"Java\":true,\"Ruby\":null}}" # hobby,interests,skillに一致するKEYが無いのでnullになる id:1 name:tasukujp hobby:null interests:null skill:null
Decodeの柔軟な読み込み
デフォルトでは、妥当でないJSONであっても読み込みが可能な TRADITIONAL モードで動作するように作成されています。モードの違いなどについてはまた別途記事を書きたいと思います。
例えば以下の JSON も仕様と照らし合わせると色々と NG な部分がありますがデコードは成功します。
String json = "hoge:[true, True]\n" + "fuga:[false, False] // コメント\n" + "'bar':[null, Null] /** コメント */\n" + "'foo':"; Object obj = JSON.decode(json);
ここで試している柔軟な読み込みに該当する部分としては以下の通りです。
- 文字列がダブルクォーテーションで囲まれてなくても文字列として認識する。
- 文字列がシングルクォーテーションで囲まれていても文字列として認識する。
- root要素がオブジェクトの場合一番外側の
{ }
を省略できる。 //
や/** /
のコメント行をコメントとして認識する。- 値 (VALUE) が省略された場合 null として認識する。
他にもありますが、このように JSON の定義通り書かれていなくても柔軟に読み込む事が可能です。
また、TRADITIONAL モードとは関係ないですが、ついでに確認として盛り込んでおいたtrue
,false
,null
については、全て小文字の場合は真偽値
とnull
として認識されますが、大文字が含まれていると文字列
として認識されます。