JavaでJSONを扱う方法
JavaでJSONを扱う方法をご紹介します。
目次
条件
- Spring Tool Suite 4
- Spring Boot 2.5.0
前提
ここでは、以下のようなJSONデータを扱います。
{
  "type":"object",
  "properties": {
    "foo": {
      "fooKey": "fooValue"
    },
    "bar": {
      "barKey": "barValue"
    },
    "baz": {
      "bazKey": "bazValue"
    }
  }
}
事前準備
JavaでJSONデータを扱うためのモデルクラスを作成します。
手で一から作成してもよいのですが、ここではJSONデータからモデルクラスを作成してくれるサービスを用います。
以下のURLにアクセスして、入力欄に対象のJSONデータを貼り付けます。
https://www.jsonschema2pojo.org/
パッケージ名やトップ階層のクラス名を指定できるので、適切な値をします。
また、以下の値を選択します。
- Source type: JSON
- Annotation style: Jackson 2.x
- Include getters and setters
- Include toString
ポイント
Spring BootではJSONの扱いに標準でJacksonが使用されるため「Jackson 2.x」を指定します。
getterとsetterおよびtoStringメソッドを予め作成しておくため、対象にチェックします。
Previewボタンを押すと、作成されるクラス一覧を確認することが出来ます。
Zipボタンを押すと、作成されたクラス一覧のリンクがボタンの横に表示され、ダウンロードすることが出来ます。
Spring Bootのプロジェクトを作成し、ダウンロードしたクラス一式を所定の場所にコピーします。
JSONのパース
以下のように行います。
ObjectMapper mapper = new ObjectMapper(); JsonRoot root = mapper.readValue(strJson, JsonRoot.class);
strJsonはJSONの文字列、JsonRoot.classは生成したJSONクラス名です。
参考ソース
JsonTestApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.example.model.JsonRoot;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@SpringBootApplication
public class JsonTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(JsonTestApplication.class, args);
        String strJson =
                "{\n"
                + "  \"type\":\"object\",\n"
                + "  \"properties\": {\n"
                + "    \"foo\": {\n"
                + "      \"fooKey\": \"fooValue\"\n"
                + "    },\n"
                + "    \"bar\": {\n"
                + "      \"barKey\": \"barValue\"\n"
                + "    },\n"
                + "    \"baz\": {\n"
                + "      \"bazKey\": \"bazValue\"\n"
                + "    }\n"
                + "  }\n"
                + "}";
        ObjectMapper mapper = new ObjectMapper();
        try {
            JsonRoot root = mapper.readValue(strJson, JsonRoot.class);
            System.out.println(root.toString());
            System.out.println(root.getType());
            System.out.println(root.getProperties().getFoo().getFooKey());
        } catch (JsonMappingException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (JsonProcessingException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }
}
実行結果
com.example.model.JsonRoot@55fee662[type=object,properties=com.example.model.Properties@54089484[foo=com.example.model.Foo@45adc393[fooKey=fooValue],bar=com.example.model.Bar@65fe2691[barKey=barValue],baz=com.example.model.Baz@479111ba[bazKey=bazValue]]] object fooValue
JSON文字列が作成したクラスの変数に格納され、対象の値を取り出せることがわかります。
JavaからJSONへの変換
以下のように行います。
ObjectMapper mapper = new ObjectMapper(); String strJson = mapper.writeValueAsString(modelインスタンス);
strJsonはJSONの文字列、JsonRoot.classは生成したJSONクラス名です。
参考ソース
JsonTestApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.example.model.Bar;
import com.example.model.Baz;
import com.example.model.Foo;
import com.example.model.JsonRoot;
import com.example.model.Properties;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@SpringBootApplication
public class JsonTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(JsonTestApplication.class, args);
        JsonRoot root = new JsonRoot();
        root.setType("ROOTのタイプ");
        Properties properties = new Properties();
        root.setProperties(properties);
        Foo foo = new Foo();
        foo.setFooKey("FOOです。");
        Bar bar = new Bar();
        bar.setBarKey("BARです。");
        Baz baz = new Baz();
        baz.setBazKey("BAZです。");
        properties.setFoo(foo);
        properties.setBar(bar);
        properties.setBaz(baz);
        ObjectMapper mapper = new ObjectMapper();
        try {
            String strJson = mapper.writeValueAsString(root);
            System.out.println(strJson);
        } catch (JsonProcessingException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }
}
実行結果
{"type":"ROOTのタイプ","properties":{"foo":{"fooKey":"FOOです。"},"bar":{"barKey":"BARです。"},"baz":{"bazKey":"BAZです。"}}}
インデントを付けて出力
ObjectMapper mapper = new ObjectMapper(); String strJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(modelインスタンス);
上記のようにすると、インデントが付いた形でJSONデータを出力することが出来ます。
{
  "type" : "ROOTのタイプ",
  "properties" : {
    "foo" : {
      "fooKey" : "FOOです。"
    },
    "bar" : {
      "barKey" : "BARです。"
    },
    "baz" : {
      "bazKey" : "BAZです。"
    }
  }
}
参考
Qiita:【Java】JSONをJavaに、JavaをJSONにする ~GSONとJacksonの使用方法~
https://qiita.com/riversun/items/cdd990e96c2bbf9cb043
jsonschema2pojo
https://www.jsonschema2pojo.org/






