307
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

GSONの基本的な使い方

はじめに

GSONは、Googleが提供するJSONデータとJavaオブジェクトを相互に変換するためのライブラリです。
google-gson - A Java library to convert JSON to Java objects and vice-versa - Google Project Hosting
https://code.google.com/p/google-gson/

JavaでJSONを扱うためのライブラリは他にJacksonJSONIC等があります。

GSONのメインとなるのは Gson クラスです。
GsonBuilder クラスを使うとより詳細な条件を指定してJavaとJSONの変換を行うことができます。
ここではGsonクラスの使い方を紹介します。

サンプルで使用するクラス

シンプルなJavaのクラスです。
PostはフィールドにUserオブジェクトとCommentオブジェクトのListを持っています。

User.java
public class User {
    public String email;
    public String fullname;

    public User(String email, String fullname) {
        this.email = email;
        this.fullname = fullname;
    }
}
Post.java
public class Post {
    public String title;
    public String content;
    public User author;
    public List<Comment> comments;

    public Post(User author, String title, String content) {
        this.comments = new ArrayList<Comment>();
        this.author = author;
        this.title = title;
        this.content = content;
    }
}
Comment.java
public class Comment {
    public String author;
    public String content;

    public Comment(String author, String content) {
        this.author = author;
        this.content = content;
    }
}

シリアライズ - toJson()

JavaからJSONへ変換する時は toJson() を使います。
デフォルトではnullのフィールドはJSONに含まれません。

ToJsonSample.java
public class ToJsonSample {
    /*
     *  JavaオブジェクトからJSONへの変換
     */
    public static void main(String[] args) {
        Gson gson = new Gson();

        User user1 = new User("bob@jmail.com", null);       //fullnameにnullをセット
        User user2 = new User("jeff@jmail.com", "Jeff");
        List<User> userList = new ArrayList<>();
        userList.add(user1);
        userList.add(user2);

        // JavaオブジェクトからJSONへの変換
        System.out.println("ユーザー: " + gson.toJson(user1));

        // JavaオブジェクトからJSONへの変換:List
        System.out.println("ユーザーリスト: " + gson.toJson(userList));

        Post newPost = new Post(userList.get(0), "postTitle", "postContent");
        Comment comment = new Comment("comment_author", "comment_comment");
        newPost.comments.add(comment);
        newPost.comments.add(comment);

        // JavaオブジェクトからJSONへの変換:フィールドにListを含むオブジェクト
        System.out.println("コメント付き投稿: " + gson.toJson(newPost));
    }
}

実行結果

ユーザー: {"email":"bob@jmail.com"}
ユーザーリスト: 
[
    {
        "email": "bob@jmail.com",
        "fullname": "Bob"
    },
    {
        "email": "jeff@jmail.com",
        "fullname": "Jeff"
    }
]
コメント付き投稿: 
{
    "title": "postTitle",
    "content": "postContent",
    "author": {
        "email": "bob@jmail.com",
        "fullname": "Bob"
    },
    "comments": [
        {
            "author": "comment_author",
            "content": "comment_comment"
        },
        {
            "author": "comment_author",
            "content": "comment_comment"
        }
    ]
}

デシリアライズ - fromJson()

JSONからJavaへ変換する時は fromJson() を使います。

FromJsonSample.java
public class FromJsonSample {

    /*
     *  JSONからJavaオブジェクトへの変換
     */
    public static void main(String[] args) {
        Gson gson = new Gson();

        // JSONからStringへの変換
        String str = gson.fromJson("\"hello\"", String.class);
        System.out.println("String: " + str);

        // JSONからJavaオブジェクトへの変換 
        User user = gson.fromJson("{\"email\":\"bob@jmail.com\",\"fullname\":\"Bob\"}", User.class);
        System.out.println("User: " + user.email + " / " + user.fullname);

        // JSONから配列への変換
        int[] array = gson.fromJson("[1, 2, 3]", int[].class);
        System.out.println("int[]: " + array[0] + ", " + array[1] + ", " + array[2]);

        // JSONからListへの変換
        List list = gson.fromJson("[\"hello\", \"hellohello\",\"hellohellohello\"]", List.class);
        System.out.println("List: " + list.get(0) + ", " + list.get(1) + ", " + list.get(2));

        // JSONからフィールドにListを含むJavaオブジェクトへの変換 
        String jsonStr = "{\"title\":\"投稿タイトル\",\"content\":\"本文本文本文\","
                + "\"author\":{\"email\":\"bob@jmail.com\",\"fullname\":\"Bob\"},"
                + "\"comments\":[{\"author\":\"Tom\",\"content\":\"コメント本文\"}]"
                + "}";
        Post post = gson.fromJson(jsonStr, Post.class);
        System.out.println("Post: タイトル=" + post.title 
                            + ", 著者=" + post.author.fullname 
                            + ", コメント件数=" + post.comments.size());      
    }
}

実行結果

String: hello
User: bob@jmail.com / Bob
int[]: 1, 2, 3
List: hello, hellohello, hellohellohello
Post: タイトル=投稿タイトル, 著者=Bob, コメント件数=1
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
307
Help us understand the problem. What are the problem?