Java 向け JSON ライブラリ Jackson でデータを読み込む

使ってみる機会があったのでメモ。

はじめに

Jackson は Java 向けの JSON 処理用のライブラリである。

ランダムアクセスで JSON からデータを読みたい。今回は、Jackson にある Databind というモジュールを使う。

データの読み込み

外部ファイルの読み込み

以下のような JSON ファイル test.json からデータを読み込む。

// test.json
{
    "member": [
        {
            "name": "John",
            "age": 22
        },
        {
            "name": "Paul",
            "age": 21
        },
        {
            "name": "George",
            "age": 19
        },
        {
            "name": "Ringo",
            "age": 22
        }
    ],
    "album": [
        {
            "name": "Rubber Soul",
            "year": 1965,
            "month": "December",
            "day": 3
        },
        {
            "name": "Revolver",
            "year": 1966,
            "month": "August",
            "day": 5
        }
    ]
}

まず、ObjectMapper を生成する。

ObjectMapper mapper = new ObjectMapper();

そして、ObjectMapper.readTree によって、JSON ファイルのデータを木構造データとしたときの根ノードを、JsonNode 型のオブジェクトとして読み込む。

JsonNode root = mapper.readTree(new File("test.json"));

特定の値の取得

JsonNode.get を使うと、木構造上の指定したキーに対応するノードを取得できる。 根ノード root から、get を使ってたどっていくような感じ。

値を取得したいキーに対応するノードで JsonNode.asTextJsonNode.asInt を使うと、そのノードの値を intString に変換して取得できる。

// member -> 0 個目の要素 -> name
String member_name = root.get("member").get(0).get("name").asText();
System.out.println(member_name);

// member -> 3 個目の要素 -> age
int age = root.get("member").get(3).get("age").asInt();
System.out.println(age);

実行結果:

John
22

配列

JsonNodeIterable<JsonNode> を実装している。 よって、今回のデータでいう memberalbum の中のように、配列になっていれば、拡張 for ループで使える。

for (JsonNode n : root.get("album")) {
    String album_name = n.get("name").asText();
    int year = n.get("year").asInt();
    String month = n.get("month").asText();
    int day = n.get("year").asInt();
    System.out.println(album_name + ": " + day + " " + month + " " + year);
}

実行結果:

Rubber Soul: 1965 December 1965
Revolver: 1966 August 1966

コード

参考文献

FasterXML

JSON, POJO 間の変換、木構造データでの読み書き、mapper の設定やアノテーションの使い方が説明されている。