• json-gson 解析泛型及解析null


    参考://public static class paraJson {
    public class paraJson{
    static Gson gson = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();

    // static Gson gson = new Gson();
    //解析 Json对象
    public static <T> T parseJson(Class<T> type,String jsonStr)throws Exception{
    // Gson gson = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
    return gson.fromJson(jsonStr,type);
    }
    // 将Json数组解析成相应的映射对象列表
    public static <T> ArrayList<T> parseJsonArray(Class<T> myClass, String jsonStr)throws Exception{
    Type type = new ListParameterizedType(myClass);
    return gson.fromJson(jsonStr, type);
    }

    private static class ListParameterizedType implements ParameterizedType {
    private Type type;
    private ListParameterizedType(Type type) {
    this.type = type;
    }
    @Override
    public Type[] getActualTypeArguments() {
    return new Type[] {type};
    }
    @Override
    public Type getRawType() {
    return ArrayList.class;
    }
    @Override
    public Type getOwnerType() {
    return null;
    }
    // implement equals method too! (as per javadoc)
    }

    /**
    * @return 不区分类型 传什么解析什么
    */
    public static <T> T toObj(String jsonStr, Type type) {
    return gson.fromJson(jsonStr, type);
    }
    }

    --------------------------------------------------

    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);
        }
    }
    -------------------------------------------------
    参考 http://blog.csdn.net/gl_mine_csdn/article/details/59652313
    http://blog.csdn.net/a332324956/article/details/50792120
  • 相关阅读:
    Linux虚拟机突然不能上网了
    项目经验不丰富、技术不突出的程序员怎么打动面试官?
    10分钟看懂!基于Zookeeper的分布式锁
    BATJ等大厂最全经典面试题分享
    分享30道Redis面试题,面试官能问到的我都找到了
    一个六年Java程序员的从业总结:比起掉发,我更怕掉队
    我是这样手写 Spring 的(麻雀虽小五脏俱全)
    自述:为什么一部分大公司还在采用过时的技术,作为技术人而言该去大公司还是小公司
    Java精选面试题之Spring Boot 三十三问
    Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)
  • 原文地址:https://www.cnblogs.com/manmanlu/p/7531207.html
Copyright © 2020-2023  润新知