2022-05-31

【Java】JSONデータを作成・変換する方法を紹介【オブジェクトの作成方法も解説】

メイン画像

JavaでJSONデータを作成・変換する方法を解説します。

JacksonやGSONといったライブラリを使用することで簡単にJSONを作成することができます。

しかし、データ量が多めのJSONだと、ライブラリを使用するだけでは少し大変です。

そのため、変換用のオブジェクトクラスを作り、ライブラリを使用してJSONに変換する方法を解説していきます。

◎この記事でわかること

➊JavaでのJSONデータ作成方法

➋JSON作成のためのJavaオブジェクト作成方法

➌JavaオブジェクトをJSONに変換する方法

➍Jackson、GSONによるJSONへの変換方法

それでは説明していきます。

1. JavaでJSONデータを作成するには?

冒頭で説明した通り、JavaでJSONデータを作成するために、まずは作成するJSON用のモデルクラスを作成します。 その後、ライブラリを使用してJSONに変換します。

1-1. 作成する2つの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" }
            ]
    }
]

2. JSON用Javaオブジェクトの作り方

それでは、上のJSONをJavaで作成するためのオブジェクト生成方法を説明します。

2-1. JSON用オブジェクト作成①

JSON「Sample1」用のオブジェクトを作成していきます。

オブジェクトは階層ごとに作成しますので、階層ごとに要素を見ます。

JSON:Sample1の階層
第1階層 第2階層
・user ・name
・salary
・married

 
まず第1階層用のオブジェクトを作ります。これが親のオブジェクトになります。 「user」要素が一番上にあるので、それを表現できるクラスを作ります。

Sample1.java
public class Sample1 {
    public User user;
    public Sample1 (User user) {
        this.user = user;
    }
}

 
次は、ユーザの情報を格納するクラスを作ります。 Sample1のJSONはuser要素の下に「name」「salary」「married」という要素を持っているので、それを格納できるクラスを作ります。

User.java
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」オブジェクトは完成です。定義する要素の型をちゃんと合わせることにも注意してください。

使い方は後ほど紹介します。

2-2. JSON用オブジェクト作成②

 
Sample1と同様に、Sample2の階層がどうなっているかを見ていきます。

JSON:Sample2の階層
第1階層 第2階層 第3階層
・id
・type
・name
・ppu
・batters
・topping
・batter
・id(topping)
・type(topping)
・id(batter)
・type(batter)

 
Sample2は階層が3階層あります。ここでも各階層ごとにオブジェクトを作成していきます。

 
最初は第1階層用にSample2オブジェクトを作ります。

第1階層のオブジェクト

Sample2.java
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階層のオブジェクト

第2階層のBatters, Topping のオブジェクトは以下です。

Batters.java
public class Batters {
    public List<Batter> batter;

    public Batters (List<Batter> batter) {
        this.batter = batter;
    }
}

 
項目battersはbatterを子要素として持っているので上のように定義します。batterは子要素に配列をもつため、リストになっています。

Topping.java
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と中身が同じなのですが、わかりやすいように一応ファイルをわけました。

第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と同じです。

3. JavaオブジェクトをJSONに変換する

ようやくここまで来ました。これまで紹介してきたオブジェクトを使ってJSONに変換してみましょう。

説明用にファイルを作成しているので、フォルダわけとかしていません、、

そのため、もし実行してみたい場合は、今回説明したファイルすべて同じフォルダ内に配置して実行してみてください。

3-1. GSONを使用して変換する

GSONライブラリを使用するにはimportが必要です。以下を参考にしてください。

gradle
compile '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>

 
以下サンプルコードです。

Sample1のソースコード

CreateJsonSample1ByGson.java
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}}

Sample2のソースコード

JSON文字数が多いのでソースが長くなってしまいました。わかりづらかったらすいません。

まずはメインロジックから載せます。メソッドは分割して書きます。

CreateJsonSample1ByGson.java
public 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に追加して返却しているだけです。

3-2. Jacksonを使用して変換する

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のソースコードの以下を変更するだけで同じことができます。

CreateJsonSample1ByJackson.java
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の説明は省略します。

4. まとめ

JavaでJsonを作成したり、変換したりする方法をご紹介しました。

Jオブジェクトを作成する部分のソースがかなり長くなってしまったので、わかりづらかったらすいません。。

Sample1の方はシンプルだと思うので、そちらを主に見ていただければ良いかと思います。

もしお役に立てていたのであれば、幸いです。

最後まで読んで頂き、ありがとうございました!

Scroll to Top