google-gson でシリアライズ・デシリアライズしたサンプル

公開日: : 最終更新日:2014/01/26 Java , ,

これまで Java で JSON を扱うときは JSONIC を使っていたが、google-gson の存在を知ったのでシリアライズ・デシリアライズのサンプルを試してみた。

作成したサンプルプログラム

サンプルは Github に登録済み。

ファイル構成

動作確認を行うテストケースが1つ。

  • src/test/java/net/tomoyamkung/GsonTest.java

シリアライズ・デシリアライズに使用するクラスが4つ。

  • src/main/java/net/tomoyamkung/BaseJson.java
  • src/main/java/net/tomoyamkung/Friend.java
  • src/main/java/net/tomoyamkung/JsonException.java
  • src/main/java/net/tomoyamkung/JsonFriend.java

わざわざ図にまでもないが、クラス図的にはこんな感じ。

2013-06-02-google-gson-class

動作確認方法

プロジェクトは Maven で作成したので、ビルド → テストは次のコマンドを実行すればOK。

$ cd $PROJECT_HOME
$ mvn eclipse:eclipse -DdownloadSources=true # Eclipse のプロジェクトにしたい場合に実行する
$ mvn clean package

mvn コマンドを実行するとちょこちょこ WARNING が出てくるが、ビルドもテストも通るのでとりあえず放置している。

使用したソフトウェアのバージョン

ちなみに、Java や Maven のバージョンは次の通り。

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
$ mvn -v
Apache Maven 3.0.4 (r1232337; 2012-01-17 17:44:56+0900)
Maven home: C:\XXX\maven-3.0.4
Java version: 1.7.0_11, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_11\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

google-gson のバージョンは pom.xml にも書いてあるが、次のものを使用。

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.2.4</version>
    <scope>compile</scope>
</dependency>

サンプルで使用したアノテーション

@Expose

明示的にシリアライズ・デシリアライズの対象としたい場合に、このアノテーションを付与する。

javadoc にもあるように、「シリアライズのときはこのフィールドを対象外にしたい」といったことができるようだ。
次の User クラスをシリアライズした場合、lastName, emailAddress, password はその対象外になる。

public class User {
    @Expose private String firstName;
    @Expose(serialize = false) private String lastName;
    @Expose (serialize = false, deserialize = false) private String emailAddress;
    private String password;
}

シリアライズするコードは次の通り。

new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(this);

@SerializedName

デフォルトだとシリアライズする際の「キー」はフィールド名と同じになるが、このアノテーションを付与すると「キー」を任意のものに変更することができる。

これも javadoc が参考になる。
次の SomeClassWithFields のフィールド someField は @SeriallizedName が設定されているため、"someField" ではなく "name" とシリアライズされている。

public class SomeClassWithFields {
    @SerializedName("name") private final String someField;
    private final String someOtherField;

    public SomeClassWithFields(String a, String b) {
        this.someField = a;
        this.someOtherField = b;
    }
}

検証コードは次の通り。

SomeClassWithFields objectToSerialize = new SomeClassWithFields("a", "b");
Gson gson = new Gson();
String jsonRepresentation = gson.toJson(objectToSerialize);
System.out.println(jsonRepresentation);

// ===== OUTPUT =====
// {"name":"a","someOtherField":"b"}

シリアライズ・デシリアライズ方法

上記の javadoc でも触れているが、シリアライズ・デシリアライズのコードを載せておく。コードは GitHub に上げてある次のクラスからの抜粋。

シリアライズ

/**
 * JsonFriend オブジェクトにデシリアライズする。
 * 
 * @param json デシリアライズする JSON
 * @return JsonFriend オブジェクト
 * @throws JsonException デシリアライズに失敗した場合
 */
public static JsonFriend fromJson(String json) throws JsonException {
    JsonFriend fromJson = new Gson().fromJson(json, JsonFriend.class);
    if(!fromJson.isSuccess()) {
        throw new JsonException(fromJson.message);
    }

    return fromJson;
}

デシリアライズ

/**
 * JsonFriend オブジェクトをシリアライズする。
 * 
 * @return シリアライズした文字列
 */
public String toJson() {
    return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(this);
}

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch-3361b5e1-resized

Optional型の変数にget()とifPresent()は使わない

Java8 から導入された Optional を勉強するため、過去にプライベートで書いたコードに O

記事を読む

no image

Exec Maven Plugin で maven コマンドでアプリを起動する

packaging タグに "jar" を指定した Maven プロジェクトをコマンドラインから起動

記事を読む

no image

Functions#compose() を使って Function を合成するサンプル(Java8 との比較付き)

Java8 と GoogleGuava の Function について コードの違いを書いた。 その

記事を読む

no image

ファイルの拡張子が JPG であるかを問い合わせるスニペット

特に目新しいこともないが、同じようなことをする機会があるかもしれないのでメモ。Gist にも登録済み

記事を読む

no image

Java から VBScript を使って Excel を印刷する

背景 Java のデスクトップアプリを作成していたときの要件に「Excel で作成された帳票を印刷

記事を読む

no image

プロセスの起動を確認するプログラム

プロセスが起動しているかを確認するプログラムを Java で書いてみました。Excel のプロセス確

記事を読む

no image

Jetty でシンプルなプロジェクトを作成してみた

プロトタイプを作成するなら Tomcat よりも Jetty のほうがさらっと出来そうだなぁ、と今さ

記事を読む

icatch_2185253176-resized

Java8 の Optional 型を返す Generics を使ったメソッドを定義する

Java8 の Optional とガード節 に続いて Java8 の Optional ネタ。今回

記事を読む

no image

ファイルに関するユーティリティ

ファイルに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。 作成

記事を読む

icatch_4610898091-resized

Java8 の Optional とガード節

メソッドの冒頭で条件チェックを行い、条件を満たしていない場合はさっさと return してしまう「ガ

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


− 1 = 三

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑