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/






