SiNBLOG

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

JSONICでMapの値を扱う

前回のエントリーの中で、Helpを発していたら、JSONICの開発者の方がコメントしてくれました!
JavaでJSONを扱うライブラリ gson を使ってみた! - SinDiary


また、丁度各ライブラリの速度比較もされていたようです。
2012-02-12 - A.R.N [日記]


さて、本題のJSONICでのMapの扱い方ですね。
教えていただいた内容を元に修正した結果が以下です。


@Test
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 = JSON.decode(json);
String pojoJson = JSON.encode(afterMap.get(POJO));
Pojo after = JSON.decode(pojoJson, Pojo.class);
assertThat(after.id, is(before.id));
assertThat(after.name, is(before.name));
}
前回のエントリーの時は、Mapから取り出した値をObject.toString()で変換した後、JSON.decode()にかけていました。
正しくは、Mapから取り出した値をJSON.encode()した後、JSON.decode()にかけるでした!


更にMapの場合についても、教えて下さいました。


@SuppressWarnings("serial")
@Test
public void JSONICでMapにPOJOを格納して取り出す2() 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 =
JSON.decode(json, (new HashMap() {
}).getClass().getGenericSuperclass());
String pojoJson = JSON.encode(afterMap.get(POJO));
Pojo after = JSON.decode(pojoJson, Pojo.class);
assertThat(after.id, is(before.id));
assertThat(after.name, is(before.name));
}
ちょっと、HashMapを生成している箇所で、Serial値を作れ!というWarningが出て消し方が分からなかったのですが、こんな感じです。
公式サイトの総称型を指定してのdecode/parseのところですね。
JSONIC - simple json encoder/decoder for java


これだけあれば、僕がやりたかったことはできる!
教えて下さったarn殿ありがとうございました!