読者です 読者をやめる 読者になる 読者になる

GSON でjson生成時の null を処理する場合、

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 の方で処理するのが正解なのか。。。。