【Java】JSONの基本とJSONICを使用してJSONの変換をする方法

スポンサーリンク

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'

 jcenter: net.arnx » jsonic

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として認識されますが、大文字が含まれていると文字列として認識されます。