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/