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/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です