Gson解析null替换为空字符串

作者: hloong | 来源:发表于2016-01-11 15:39 被阅读15075次

    json解析有很多工具,这里说的是最常用也是解析速度最快的Gson,Gson是google家出的,有一个缺点就是无法设置null替换,
    我们只能手动的批量替换服务器返回的null了,正常的接口定义的时候是绝对不允许服务器返回null的,后台结果却总会出现null!
    如果搜索的话有一个常见的答案,
    Gson gson = new GsonBuilder().serializeNulls().create();
    但是这个却无法解决反序列问题,怎么解决呢?我在stackoverflow上找到了这个问题,亲测有效
    http://stackoverflow.com/questions/9483348/gson-treat-null-as-empty-string/24252578#24252578

    解决办法如下:

    Gson gson  = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
    //然后用上面一行写的gson来序列化和反序列化实体类type
    gson.fromJson(json, type);
    gson.toJson(type);
    

    //NullStringToEmptyAdapterFactory的代码

    public class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory {
        @SuppressWarnings("unchecked")
        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 StringNullAdapter();
        }
    }
    

    // StringNullAdapter代码

    public class StringNullAdapter extends TypeAdapter<String> {
        @Override
        public String read(JsonReader reader) throws IOException {
            // TODO Auto-generated method stub
            if (reader.peek() == JsonToken.NULL) {
                reader.nextNull();
                return "";
            }
            return reader.nextString();
        }
        @Override
        public void write(JsonWriter writer, String value) throws IOException {
            // TODO Auto-generated method stub
            if (value == null) {
                writer.nullValue();
                return;
            }
            writer.value(value);
        }
    }
    

    相关文章

      网友评论

      • 1dd59ae3f8c6:我用了你这段代码,如果json中包含了非String格式的数据,reader.nextString()那就直接抛异常了,如果不能适应多种格式的数据,那么这个东西的使用就很局限了。
        1dd59ae3f8c6:@hloong 你理解错我意思了,不是说null还有什么别的类型,我的说是json中 有包含String的返回值也有int型的返回值,reader.nextString()读取到非String型的返回值的时候直接就抛异常。这个只有当所有返回的数据都是String格式的时候,才可以判断为null的情况。
        hloong:一般服务器返回值给null的都是String类型,其他类型比如int会给0不会给null解析也不会报错!如果你们服务器非String格式给null,后台人员也不想改,那你可以不用gson解析,直接原生解析然后每个值前判断
      • 易水寒1992:感謝,是可以去除json格式中,類型是String,值是null的
        c06416c66669:请问怎么搞?我也是想直接去掉類型是String,值是null的字段
      • 0e82434228a3:Integer类型字段在没有设值的情况下,GSON会反序列化成0,请问怎样获取null呢?
        hloong:@丁攻子 Integer不适用,只支持String类型值为null的转换
      • 兰亦辛:用了 这段 代码 并没有 效果?
        hloong:@兰亦辛 只支持String类型的转义
      • 繁体字遇上简体字:小白请问,这种序列化后,请问解析json的时候就不需要来判断是否是空的了?
        hloong:@繁体字遇上简体字 仅仅只针对null这种数据,也就是说,你不需要判断序列化的参数是否为null了,已经自动转成“”

      本文标题:Gson解析null替换为空字符串

      本文链接:https://www.haomeiwen.com/subject/pugqkttx.html