Google gson で、toJson をする時、null → "" になるように、
NullStringToEmptyAdapterFactory なるものを書いていた。
もしくは、どこかのライブラリには似たようなものがあってそれを使ったりしていたが、
でもこれでは、Map に対しては効かない、Map にKey が存在しても value が null の場合は、
toJson では key と value まるごと生成されない。
正しいのだけれど、 key : "" を作って欲しい場合がある。
そこで、Map のシリアライザを用意
import java.lang.reflect.Type; import java.util.Map; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; /** * Mapシリアライザ. */ public class MapSerializer implements JsonSerializer<Map<String, Object>>{ @Override public JsonElement serialize(Map<String, Object> map, Type typeOfSrc, JsonSerializationContext context){ JsonObject jsonObject = new JsonObject(); for(Map.Entry<String, Object> entry : map.entrySet()){ if (entry.getValue()==null){ jsonObject.add(entry.getKey(), context.serialize("")); continue; }else if(entry.getValue() instanceof Map){ jsonObject.add(entry.getKey(), this.serialize((Map<String, Object>)entry.getValue(), typeOfSrc, context) ); continue; } jsonObject.add(entry.getKey(), context.serialize(entry.getValue())); } return jsonObject; } }
使い方
Map<String, Object> map = new HashMap<>(); Gson gson = new GsonBuilder() .registerTypeAdapter(new TypeToken<Map<String, Object>>(){}.getType(), new MapSerializer()) .create(); String s = gson.toJson(map, new TypeToken<Map<String, Object>>(){}.getType());
toJson の時に、TypeTokenを指定しないといけない。