google GSON でJSONを生成する場合、そのままだと、nullオブジェクトは無視(出力されない)なので、GsonBuilder の serializeNulls() を呼び出して、 { "a": "null" } のように出す。
しかし、String オブジェクトの結果として、{ "a": "" } が欲しい場合がある。
JsonSerializer<String> を実装した adapter を書いてみたが、うまくいかない。
古い情報だが、
http://stackoverflow.com/questions/9483348/gson-treat-null-as-empty-string
にヒントがあった。当時のバージョンよりバージョンUPが期待されていたが、2.6.2でも一向に解決されてない。stackoverflow に書いてあった TypeAdapterFactoryの方法が最も有効で、stackoverflowに書いてあったものを修正すると思いどおりになる。
import java.io.IOException; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; /** * StringAdapter */ public class StringAdapter extends TypeAdapter{ @Override public String read(JsonReader reader) throws IOException{ if (reader.peek() == JsonToken.NULL){ reader.nextNull(); return ""; } return reader.nextString(); } @Override public void write(JsonWriter writer, String value) throws IOException { if (value == null) { writer.value(""); return; } writer.value(value); } } public class NullStringToEmptyAdapterFactory implements TypeAdapterFactory{ public TypeAdapter create(Gson gson, TypeToken type){ Class rawType = (Class ) type.getRawType(); if (rawType != String.class){ return null; } return (TypeAdapter ) new StringAdapter(); } }
この TypeAdapterFactory の create で無名クラスで返すように書きたかったのだが、
うまく書けなかった。
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory())
.create();
でも、Google group の投稿には、gsonで作成済の json 文字列に対して、replaceAll("nill", "\"\"") を実行すればいいじゃないのように、書いてある。
いや、確かにそうなんだけど。。。。
それなら、replaceAll(":\"null\"", "\"\"") って書くけど。。。replaceAll がもし負荷が上がるなら、TypeAdpter の方で処理するのが正解なのか。。。。