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

GSON でjson生成時の null を処理する(2)

先日書いたGSON使用時の  String型のNULLパターン { "aaa": "null" } でなくて、

{ "aaa": "" } にするための TypeAdapterFactory を書き直しました。

import java.io.IOException;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
/**
 * NullStringToEmptyAdapterFactory
 */
public class NullStringToEmptyAdapterFactory implements TypeAdapterFactory{
   @Override
   public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
      Class<T> rawType = (Class<T>)type.getRawType();
      if (rawType != String.class){
          return null;
      }
      return (TypeAdapter<T>) new TypeAdapter<String>(){
         @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);
         }
      };
   }
}
Integer型も、対応するなら、ちょっと長くなりますが、、、

import java.io.IOException;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
/**
 * NullStringIntegerToEmptyAdapterFactory
 */
public class NullStringIntegerToEmptyAdapterFactory implements TypeAdapterFactory{
   @Override
   public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
      Class<T> rawType = (Class<T>)type.getRawType();
      if (rawType != String.class && rawType != Integer.class){
          return null;
      }
      if (rawType==Integer.class){
         return (TypeAdapter<T>) new TypeAdapter<Integer>(){
            @Override
            public Integer read(JsonReader reader) throws IOException {
               if (reader.peek()==JsonToken.NULL){
                  reader.nextNull();
                  return null;
               }
               String s = reader.nextString();
               return s==null || "".equals(s) ? null : new Integer(s);
            }
            @Override
            public void write(JsonWriter writer, Integer value) throws IOException {
               if (value==null){
                  writer.value("");
                  return;
               }
               writer.value(value.toString());
            }
         };
      }
      return (TypeAdapter<T>) new TypeAdapter<String>(){
         @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);
         }
      };
   }
}