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

関連記事

no image

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

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

記事を読む

no image

Google Guava の Function を使った文字列加工の FluentIterable サンプル

お客様の都合上 Java7 で開発している案件があるのだが、Java8 の Function とか

記事を読む

no image

ディレクトリに関するユーティリティ

ディレクトリに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。

記事を読む

no image

Stream#filter()で絞り込みmap()で処理するコードスニペット

Java8 から導入された Stream API も少しずつ慣れてきて、「そういえばこういうパターン

記事を読む

icatch_4610898091-resized

Java8 の Optional とガード節

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

記事を読む

no image

画像ファイルを選別するFilenameFilter

画像ファイルのみアップロードを許可する仕様があって、何てことはないがフィルターを作って対応したのでメ

記事を読む

no image

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

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

記事を読む

icatch-10139609144_5bc33706f9_z-resized

保存ダイアログを表示させてファイルをダウンロードさせる方法

例えば、ブラウザに表示している画像は右クリックを使ってダウンロードできますが、左クリックから保存ダイ

記事を読む

no image

Spark を使って JSON を返すシンプルな API を書いてみた

必要に迫られてモックの API を作成することになった。 大した工数を割けないので使ったことのある

記事を読む

icatch-zip_524574337_mini-thumbnail

Java でファイルが1つだけ圧縮された zip を解凍するサンプル

ファイルが1つだけ圧縮された zip を解凍するサンプルです。 単一ファイルが圧縮された zip

記事を読む

Googleアドセンス用(PC)

Message

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


一 − = 0

次の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 ↑