
JavaでJSONデータを作成・変換する方法を解説します。
JacksonやGSONといったライブラリを使用することで簡単にJSONを作成することができます。
しかし、データ量が多めのJSONだと、ライブラリを使用するだけでは少し大変です。
そのため、変換用のオブジェクトクラスを作り、ライブラリを使用してJSONに変換する方法を解説していきます。
➊JavaでのJSONデータ作成方法
➋JSON作成のためのJavaオブジェクト作成方法
➌JavaオブジェクトをJSONに変換する方法
➍Jackson、GSONによるJSONへの変換方法
それでは説明していきます。
冒頭で説明した通り、JavaでJSONデータを作成するために、まずは作成するJSON用のモデルクラスを作成します。 その後、ライブラリを使用してJSONに変換します。
今回Javaで作成するJsonサンプルは以下2つです。
「Sample1」は簡単なJSONで、文字列、数値とBooleanを扱います。
「Sample2」は配列などが含まれた、データ構造が複雑なものです。
●Sample1{
"user": {
"name": "John",
"salary": 10000,
"married": true
}
}
●Sample2 参照:JSON Data Set Sample(Example 5)
[
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters":
{
"batter":
[
{ "id": "1001", "type": "Regular" },
{ "id": "1002", "type": "Chocolate" },
{ "id": "1003", "type": "Blueberry" },
{ "id": "1004", "type": "Devil's Food" }
]
},
"topping":
[
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5005", "type": "Sugar" },
{ "id": "5007", "type": "Powdered Sugar" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
},
{
"id": "0002",
"type": "donut",
"name": "Raised",
"ppu": 0.55,
"batters":
{
"batter":
[
{ "id": "1001", "type": "Regular" }
]
},
"topping":
[
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5005", "type": "Sugar" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
},
{
"id": "0003",
"type": "donut",
"name": "Old Fashioned",
"ppu": 0.55,
"batters":
{
"batter":
[
{ "id": "1001", "type": "Regular" },
{ "id": "1002", "type": "Chocolate" }
]
},
"topping":
[
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
}
]
それでは、上のJSONをJavaで作成するためのオブジェクト生成方法を説明します。
JSON「Sample1」用のオブジェクトを作成していきます。
オブジェクトは階層ごとに作成しますので、階層ごとに要素を見ます。
第1階層 | 第2階層 |
---|---|
・user | ・name ・salary ・married |
まず第1階層用のオブジェクトを作ります。これが親のオブジェクトになります。
「user」要素が一番上にあるので、それを表現できるクラスを作ります。
public class Sample1 {
public User user;
public Sample1 (User user) {
this.user = user;
}
}
次は、ユーザの情報を格納するクラスを作ります。
Sample1のJSONはuser要素の下に「name」「salary」「married」という要素を持っているので、それを格納できるクラスを作ります。
public class User {
public String name;
public Integer salary;
public Boolean married;
public User(String name, Integer salary, Boolean married) {
this.name = name;
this.salary = salary;
this.married = married;
}
}
これで「sample1」オブジェクトは完成です。定義する要素の型をちゃんと合わせることにも注意してください。
使い方は後ほど紹介します。
Sample1と同様に、Sample2の階層がどうなっているかを見ていきます。
第1階層 | 第2階層 | 第3階層 |
---|---|---|
・id ・type ・name ・ppu ・batters ・topping |
・batter ・id(topping) ・type(topping) |
・id(batter) ・type(batter) |
Sample2は階層が3階層あります。ここでも各階層ごとにオブジェクトを作成していきます。
最初は第1階層用にSample2オブジェクトを作ります。
import java.math.BigDecimal;
import java.util.List;
public class Sample2 {
public String id;
public String type;
public String name;
public BigDecimal ppu;
public Batter batters;
public List<Topping> topping;
public Sample2 (String id, String type, String name
, BigDecimal ppu, Batter batters, List<Topping> topping) {
this.id = id;
this.type = type;
this.name = name;
this.ppu = ppu;
this.batters = batters;
this.topping = topping;
}
}
第1階層の項目名を全て定義しました。
第2、3階層にデータを持っている項目に関しては、 別オブジェクトとして定義します(batter, topping)。下で紹介します。
また、「topping」に関しては、配下のデータ構造が配列になっているので、型をリストとして定義しています。
配列か配列じゃないかの見分け方は以下です。
中かっこ({)から始まっている ⇒ 子要素は単一の要素
大かっこ([)から始まっている ⇒ 子要素は配列
※battersは、batterという子要素を一つ持ち、batterは配列の子要素を持っています。 batterの方が複数要素を持ってしまっているので、引用したJSONの項目名が少しややこしいです。
第2階層のBatters, Topping のオブジェクトは以下です。
Batters.javapublic class Batters {
public List<Batter> batter;
public Batters (List<Batter> batter) {
this.batter = batter;
}
}
項目battersはbatterを子要素として持っているので上のように定義します。batterは子要素に配列をもつため、リストになっています。
public class Topping {
public String id;
public String type;
public Topping (String id, String type) {
this.id = id;
this.type = type;
}
}
toppingは「id」と「type」をもつので、上のように定義すればOKです。
このオブジェクトは、第3階層で作成するBatter.javaと中身が同じなのですが、わかりやすいように一応ファイルをわけました。
public class Batter {
public String id;
public String type;
public Batter (String id, String type) {
this.id = id;
this.type = type;
}
}
Batterは子要素に「id」と「type」をもつので、作成するオブジェクトは先ほどのTopping.javaと同じです。
ようやくここまで来ました。これまで紹介してきたオブジェクトを使ってJSONに変換してみましょう。
説明用にファイルを作成しているので、フォルダわけとかしていません、、
そのため、もし実行してみたい場合は、今回説明したファイルすべて同じフォルダ内に配置して実行してみてください。
GSONライブラリを使用するにはimportが必要です。以下を参考にしてください。
gradlecompile 'com.google.code.gson:gson:2.8.5'
Maven
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
以下サンプルコードです。
import com.google.gson.Gson;
public class CreateJsonSample1ByGson {
public static void main(String[] args) {
// ユーザ項目のデータを設定
User user = new User("John", 10000, true);
// Sample1のオブジェクトを生成する
Sample1 sample1 = new Sample1(user);
// GSONを使用
Gson gson = new Gson();
// Sample1のオブジェクトをJSONに変換して出力
System.out.println(gson.toJson(sample1));
}
}
「GSON」の「toJson」メソッドを使用してあげれば簡単にオブジェクトをJSON変換できます。
こちらが出力結果です。一行になっていますが、整形すればSample1のJSONと同じです。
{"user":{"name":"John","salary":10000,"married":true}}
JSON文字数が多いのでソースが長くなってしまいました。わかりづらかったらすいません。
まずはメインロジックから載せます。メソッドは分割して書きます。
CreateJsonSample1ByGson.javapublic class CreateJsonSample2ByGson {
public static void main(String[] args) {
// Sample2のオブジェクトを生成する
// Sample2は配列でid=0001~0003のデータがあるためリストを生成する
List<Sample2> sample2 = createSample2Object();
// GSONを使用
Gson gson = new Gson();
// Sample2のオブジェクトをJSONに変換して出力
System.out.println(gson.toJson(sample2));
}
/**
* JSONに変換するSample2オブジェクトを生成して返却する
* @return JSONに変換するSample2オブジェクト
*/
private static List<Sample2> createSample2Object() {
// 長くなるので分割しました。下で書いています。
}
/**
* 引数で渡されたBatterでBattersオブジェクトを生成して返却する
* @param batters 引数に指定されたBatter(可変長引数)
* @return Battersオブジェクト
*/
private static Batters createBatters(Batter... batters) {
// 長くなるので分割しました。下で書いています。
}
/**
* 引数で渡されたToppingのリストを生成して返却する
* @param toppings 引数に指定されたTopping(可変長引数)
* @return Toppingのリスト
*/
private static List<Topping> createTopping(Topping... toppings) {
// 長くなるので分割しました。下で書いています。
}
}
GSONを使用している個所が変換処理をしている個所ですが、Sample1と全くソースが同じのため、説明省略します。
「createSample2Object」メソッド private static List<Sample2> createSample2Object() {
List<Sample2> sample2 = new ArrayList<>();
// id=0001のJSONデータ作成
// Battersを生成
Batters batters = createBatters(
// id=0001のBatterをセット
new Batter("1001", "Regular"),
new Batter("1002", "Regular"),
new Batter("1003", "Blueberry"),
new Batter("1004", "Devil's Food"));
// Toppingリストを生成
List<Topping> toppingList = createTopping(
// id=0001のToppingをセット
new Topping("5001", "None"),
new Topping("5002", "Glazed"),
new Topping("5005", "Sugar"),
new Topping("5007", "Powdered Sugar"),
new Topping("5006", "Chocolate with Sprinkles"),
new Topping("5003", "Chocolate"),
new Topping("5004", "Maple"));
// id=0001のSample2オブジェクトを生成して、リストに詰める
sample2.add(
new Sample2("0001", "donut", "Cake",
new BigDecimal("0.55"), batters, toppingList));
// id=0002のJSONデータ作成
// Battersを生成
batters = createBatters(
// id=0002のBatterをセット
new Batter("1001", "Regular"));
// Toppingリストを生成
toppingList = createTopping(
// id=0002のToppingをセット
new Topping("5001", "None"),
new Topping("5002", "Glazed"),
new Topping("5005", "Sugar"),
new Topping("5003", "Chocolate"),
new Topping("5004", "Maple"));
// id=0002のSample2オブジェクトを生成して、リストに詰める
sample2.add(
new Sample2("0002", "donut", "Raised",
new BigDecimal("0.55"), batters, toppingList));
// id=0003のJSONデータ作成
// Battersを生成
batters = createBatters(
// id=0003のBatterをセット
new Batter("1001", "Regular"),
new Batter("1002", "Chocolate"));
// Toppingリストを生成
toppingList = createTopping(
// id=0003のToppingをセット
new Topping("5001", "None"),
new Topping("5002", "Glazed"),
new Topping("5003", "Chocolate"),
new Topping("5004", "Maple"));
// id=0003のSample2オブジェクトを生成して、リストに詰める
sample2.add(
new Sample2("0003", "donut", "Old Fashioned",
new BigDecimal("0.55"), batters, toppingList));
return sample2;
}
「batter」と「topping」に関しては、メソッドを作成して、引数に設定したい値を渡すことで処理をしています。
それ以外は、Sample2オブジェクトに直接値を設定しているだけです。
「createBatters」メソッド private static Batters createBatters(Batter... batters) {
List<Batter> batterList = new ArrayList<>();
for (Batter batter : batters) {
// 引数で渡ってきたtoppingをリストに追加する
batterList.add(batter);
}
// battersにbatterを格納して返却
return new Batters(batterList);
}
引数の「Batter...」は可変長引数というもので、引数に好きな数だけBatterのデータを渡すことができます。
for文で渡ってきた引数文ループして、Battersオブジェクトに設定しています。
「createTopping」メソッド private static List<Topping> createTopping(Topping... toppings) {
List<Topping> toppingList = new ArrayList<>();
for (Topping topping : toppings) {
// 引数で渡ってきたtoppingをリストに追加する
toppingList.add(topping);
}
// toppingListを返却
return toppingList;
}
「createBatters」メソッドと処理はほぼ同じです。こちらは引数で渡ってきたToppingのデータ分ループしてListに追加して返却しているだけです。
JacksonライブラリもGSON同様、使用するにはimportが必要です。以下を参考にしてください。
gradle(build.gradle)compile 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
Maven(pom.xml)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
Jacksonを使用して変換する場合は、上で紹介したGSONのソースコードの以下を変更するだけで同じことができます。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class CreateJsonSample1ByGson {
public static void main(String[] args) throws JsonProcessingException {
// Sample1のオブジェクトを生成する
User user = new User("John", 10000, true);
Sample1 sample1 = new Sample1(user);
// GSONを使用
// Gson gson = new Gson();
// Sample1のオブジェクトをJSONに変換して出力
// System.out.println(gson.toJson(sample1));
// ↓ に変更
// Jacksonを使用
ObjectMapper objectMapper = new ObjectMapper();
// Sample1のオブジェクトをJSONに変換して出力
System.out.println(objectMapper.writeValueAsString(sample1));
}
}
「ObjectMapper」の「writeValueAsString」メソッドを使うように書き換えるだけで、他は全く同じです。
Sample1とSample2は変換部分が同じコードになっているのでSample2の説明は省略します。
JavaでJsonを作成したり、変換したりする方法をご紹介しました。
Jオブジェクトを作成する部分のソースがかなり長くなってしまったので、わかりづらかったらすいません。。
Sample1の方はシンプルだと思うので、そちらを主に見ていただければ良いかと思います。
もしお役に立てていたのであれば、幸いです。
最後まで読んで頂き、ありがとうございました!