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";
Mapmap = new HashMap ();
Pojo before = new Pojo();
map.put(POJO, before);
String json = JSON.encode(map);
MapafterMap = 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";
Mapmap = new HashMap ();
Gson gson = new Gson();
Pojo before = new Pojo();
map.put(POJO, before);
String json = gson.toJson(map);Type mapType = new TypeToken
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つなので、JavaのJSONを扱うライブラリでポピュラーなのは、この3つなのかな?
2012/02/22追記
JSONIC開発者のarn殿にご教授いただいたので、JSONICで同じことをする記事を書きました。
JSONICでMapの値を扱う - SinDiary