json-gson解析泛型及解析null

manmanlu      2022-02-13     365

关键词:

参考://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





















































java泛型及泛型通配符?

1、泛型其实指得就是参数化类型,使得代码可以适应多种类型2、类型通配符一般是使用?代替具体的类型实参。可以解决当具体类型不确定的时候,这个通配符就是 ?  ;当操作类型时,不需要使用类型的具体功能时... 查看详情

fastjson将json解析成含有泛型对象,内部泛型对象再次解析出错的解决办法(android)

...有这个问题异常重现简单说一下抛出异常的代码:(1)解析json代码如下:RecommendBean<RecommendListBean>obj=JSON.parseObject(jsonString,newTypeReferen 查看详情

json解析为泛型对象

一、方法public<T>TjsonToObjByType(Stringstr,Typetype){try{if(isValidJson(str)){returngson.fromJson(str,type);}}catch(JsonSyntaxExceptione){System.out.println(e.getMessage());}returnnull;} 二、调用示 查看详情

java程序员必备基础:泛型解析

前言整理一下Java泛型的相关知识,算是比较基础的,希望大家一起学习进步。一、什么是Java泛型Java泛型(generics)是JDK5中引入的一个新特性,其本质是参数化类型,解决不确定具体对象类型的问题。其所操作的数据类型被指定... 查看详情

泛型解析(代码片段)

                                 &n 查看详情

c#泛型方法解析

  C#2.0引入了泛型这个特性,由于泛型的引入,在一定程度上极大的增强了C#的生命力,可以完成C#1.0时需要编写复杂代码才可以完成的一些功能。但是作为开发者,对于泛型可谓是又爱又恨,爱的是其强大的功能,以及该... 查看详情

spring组件spring是如何解析泛型-resolvalbetype

Spring组件(一)Spring是如何解析泛型-ResolvalbeTypeSpring系列目录(https://www.cnblogs.com/binarylei/p/10117436.html)JavaType泛型系列文章:Java-Type介绍Java-Type的获取方式Spring-ResolvableTypeSpring中大量使用反射,需要获取泛型的具体类型,为此专门... 查看详情

nslookup 报告“无法解析 '(null)':名称无法解析”,尽管它成功解析了 DNS 名称

】nslookup报告“无法解析\\\'(null)\\\':名称无法解析”,尽管它成功解析了DNS名称【英文标题】:nslookupreported"can\'tresolve\'(null)\':Namedoesnotresolve"thoughitsuccessfullyresolvedtheDNSnamesnslookup报告“无法解析\'(null)\':名称无法解析”... 查看详情

Java:如何解析 lambda 参数的泛型类型?

】Java:如何解析lambda参数的泛型类型?【英文标题】:Java:howtoresolvegenerictypeoflambdaparameter?【发布时间】:2014-07-1420:22:39【问题描述】:嗯,我们有FunctionalInterface:publicinterfaceConsumer<T>voidaccept(Tt);我可以像这样使用它:.handle... 查看详情

Visual Studio 2012 - 自引用泛型解析错误

】VisualStudio2012-自引用泛型解析错误【英文标题】:VisualStudio2012-SelfReferencingGenericsParsingErrors【发布时间】:2012-09-0718:09:08【问题描述】:我在这里遇到了一些麻烦,在我们公司,我们有一个使用自引用泛型的自滚动DA层。在Visual... 查看详情

使用gson结合泛型解析数据

参考技术A使用Gson结合泛型解析数据时,用到了这么一个方法parameterizedType.getActualTypeArguments()[0]那么它是什么意思呢?getClass().getGenericSuperclass()返回表示此Class所表示的实体(类、接口、基本类型或void)的直接超类的Type,然后将... 查看详情

TypeScript 泛型:如果 Promise 拒绝和解析类型不同怎么办?

】TypeScript泛型:如果Promise拒绝和解析类型不同怎么办?【英文标题】:TypeScriptgenerics:whatifPromiserejectandresolvetypesdiffer?【发布时间】:2018-01-2107:48:27【问题描述】:处理错误和使用Promises的简单通用Angular2+数据服务://importsskippedc... 查看详情

实例:gson解析泛型对象(代码片段)

一,前期基础知识储备1)Java泛型Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所... 查看详情

swift之深入解析“泛型”的底层原理(代码片段)

一、泛型简介①Swift泛型Swift提供了泛型可以写出灵活且可重用的函数和类型。Swift标准库是通过泛型代码构建出来的,Swift的数组和字典类型都是泛型集。泛型可以创建一个Int数组,也可创建一个String数组,或者甚至... 查看详情

将泛型 T 的类型解析为 C# 中的特定接口

】将泛型T的类型解析为C#中的特定接口【英文标题】:ResolvetypeofgenericTtoaspecificinterfaceinC#【发布时间】:2014-11-0300:20:16【问题描述】:我想在运行时找到泛型T的类型并进行比较以检查它是哪个接口。因此,这适用于在运行时查... 查看详情

.net中委托的解析泛型解析可变性解析表达式和匿名方法基invoke的用法()

委托解析:http://www.cnblogs.com/DeepLearing/p/4594518.html.net泛型解析(上)http://www.cnblogs.com/DeepLearing/p/4554867.html#3211258.net可变性解析:http://www.cnblogs.com/DeepLearing/p/4592759.html.netLambda表达式和匿名方法:http://www.cnblogs.co... 查看详情

计算机程序的思维逻辑(36)-泛型(中)-解析通配符

...用于Java容器类中,它到底是什么?本节,让我们逐步来解析。更简洁的参数类型限定在上节最后,我们提到一个例子,为了将Integer对象添加到Number容器中,我们的类型参数使用了其他类型参数作为上界,代码是:public<TextendsE... 查看详情

【lua】cjson解析null

参考技术A最近遇到一个问题,在lua中使用cjson解析json中数据为null时,解析出来是一个userdata。如图:我们需要判断这个值使用cjson.null。具体的可以看看文档很详细。 查看详情