SiNBLOG

140文字に入らないことを、極稀に書くBlog

JavaでJSONを扱うライブラリ gson を使ってみた!

今までJSONを扱う時は、JSONICを使っていました。
まぁ、これしか知らなかったのですねw
しかし、とあることをしようとした時に、どうやれば良いのか分からなかったのです。
それは、Mapに入れたClassをEncodeした後、元のClassに戻すこと。
Ajaxで戻す時に使っていたのですが、JavaScript側では取り出すことはできました。
しかし、UnitTestを書こうとしてつまりました・・・。

そんな時、神の声が・・・!

というわけで、使ってみることに。
まず、gsonとはなんぞや?ということですが、Google製のJSONを扱うためのライブラリです。
GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back
Gson User Guide - gson

今のところ、2.1が最新のようですね。
全部英語ですが、サンプルソースを見れば、何となく分かります。


そして、今回やりたいことができるかを試してみました!
比較用にJSONICでつまってるソースも書いてます。
だれか、JSONICでのやり方教えてくださいw


package org.sinsandbox.util;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import net.arnx.jsonic.JSON;
import net.arnx.jsonic.JSONException;

import org.junit.Test;
import org.slim3.tester.AppEngineTestCase;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class JsonUtilTest extends AppEngineTestCase {

@Test(expected = JSONException.class)
public void JSONICでMapにPOJOを格納して取り出す() throws Exception {
final String POJO = "pojo";
Map map = new HashMap();
Pojo before = new Pojo();
map.put(POJO, before);
String json = JSON.encode(map);
Map afterMap = new HashMap();
afterMap = JSON.decode(json);
String pojoJson = afterMap.get(POJO).toString();
assertThat(pojoJson, is("{id=1, name=hoge}")); // JSON形式ではなく、"="で区切られている
JSON.decode(pojoJson, Pojo.class); // decodeできず、例外発生
}

@Test
public void gsonでMapにPOJOを格納して取り出す() throws Exception {
final String POJO = "pojo";
Map map = new HashMap();
Gson gson = new Gson();
Pojo before = new Pojo();
map.put(POJO, before);
String json = gson.toJson(map);

Type mapType = new TypeToken>() {
}.getType();
Map afterMap = gson.fromJson(json, mapType);
String pojoJson = afterMap.get(POJO).toString();
Pojo after = gson.fromJson(pojoJson, Pojo.class);
assertThat(after.id, is(before.id));
assertThat(after.name, is(before.name));
}

private class Pojo {
public int id = 1;
public String name = "hoge";
}
}

とりあえず、やりたかったことはgsonでできました!
また、調べている時にこんな記事も見つけました。
How Buying a Business - How Start or Selling: Business Tips | Business Tips
バージョンが古いので、今はどうなっているか分かりませんが、この時はJacksonが圧倒的な力を放っていますね。
比較されているのが3つなので、JavaJSONを扱うライブラリでポピュラーなのは、この3つなのかな?


2012/02/22追記
JSONIC開発者のarn殿にご教授いただいたので、JSONICで同じことをする記事を書きました。
JSONICでMapの値を扱う - SinDiary