博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一次Json转Bean的过滤Null的分析(上)
阅读量:6069 次
发布时间:2019-06-20

本文共 2657 字,大约阅读时间需要 8 分钟。

和后台进行数据交互时,后台可能给出类似与这样的JSON数据格式:

{    "StringIsNull":null,    "DoubleIsNUll":null,    "LongIsNull":null,    "ObjectIsNull":null,    "ArrayIsNull":null,    "ObjectConvertString":{        "item1":"v1",        "item2":{            "i3":"d1",            "i4":"d2"        }    }}复制代码

而我们一般用new Gson().fromJson(),去转换成Bean。Bean里面的字段就会被赋值为Null,引用的时候就会报空指针异常并且闪退(强烈建议去跟后台刚,实在刚不过,就接着看....)。

Gson如何将jsonString转成Bean?

先跟踪下代码看看:(注释在代码里面,一张张图仔细看哦)

  • 0

  • 1

  • 2

  • 3

  • 4、实际处理的地方

  • 5

  • 6、这里声明了对应的实现工厂类

  • 7、看下String工厂这么被添加实现的(这个图应该截TypeAdapter的,不过不影响分析)

详细分析都在图片里面了

怎么更改相应的工厂实现类?

根据上面的分析,如果要改成其为null时的字段赋值为'',就必须要重写对应的Adapter。如TypeAdapter ,而Gson中自带的TypeAdapter,是static final 并且初始化好了。反射更改肯定走不通了。

Gson其实是用GsonBuilder生成的。而GsonBuilder里面有一个方法registerTypeAdapter()

示例实现更改返回的String为null时,赋值为""

相关的Adapter 拷贝出来,然后在return 返回相应的初始化值即可。

特殊情况 如:Long Double Float这种,有基本类型(long,double,float)时,直接在实体类中字段类型改成基本类型,就会自动转成默认值。

public class GsonUtils {    private static Gson gson;    //String 拷贝出来就可以了。    public static final TypeAdapter
STRING = new TypeAdapter
() { @Override public String read(JsonReader in) throws IOException { JsonToken peek = in.peek(); if (peek == JsonToken.NULL) { in.nextNull(); return ""; } /* coerce booleans to strings for backwards compatibility */ if (peek == JsonToken.BOOLEAN) { return Boolean.toString(in.nextBoolean()); } return in.nextString(); } @Override public void write(JsonWriter out, String value) throws IOException { out.value(value); } }; //根据GsonBuilder 创建Gson static { GsonBuilder gsonBuilder=new GsonBuilder(); //注册registerTypeAdapter 就可以了 gsonBuilder.registerTypeAdapter(String.class, STRING); gson=gsonBuilder.create(); } /** * Json字符串 转为指定对象 * * @param json json字符串 * @param type 对象类型 * @param
对象类型 * @return * @throws JsonSyntaxException */ public static
T toBean(String json, Type type) throws JsonSyntaxException { T obj = gson.fromJson(json, type); return obj; }}复制代码

测试后结果如下:

//原始数据 {
"StringIsNull":null,"DoubleIsNUll":null,"LongIsNull":null}//正常使用new Gson().fromJson()后的数据 {StringIsNull='null', DoubleIsNUll=null, LongIsNull=null}//注册TypeAdapter
和更改Double为double,Long为long后的数据 {StringIsNull='', DoubleIsNUll=0.0, LongIsNull=0}复制代码

还有以下几个问题,将会在下篇中解决

  • 1、Object返回为null时,或者非Object时,处理成自动new Obejct();
  • 2、Array列表为null时,处理成自动new ArrayList<>();

转载于:https://juejin.im/post/5b4716e9e51d45195e0f467a

你可能感兴趣的文章
Oracle DG 逻辑Standby数据同步性能优化
查看>>
exchange 2010 队列删除
查看>>
android实用测试方法之Monkey与MonkeyRunner
查看>>
「翻译」逐步替换Sass
查看>>
H5实现全屏与F11全屏
查看>>
处理excel表的列
查看>>
枸杞子也能控制脂肪肝
查看>>
Excuse me?这个前端面试在搞事!
查看>>
C#数据采集类
查看>>
quicksort
查看>>
检验函数运行时间
查看>>
【BZOJ2019】nim
查看>>
Oracle临时表空间满了的解决办法
查看>>
四部曲
查看>>
LINUX内核调试过程
查看>>
【HDOJ】3553 Just a String
查看>>
Java 集合深入理解(7):ArrayList
查看>>
2019年春季学期第四周作业
查看>>
linux环境配置
查看>>
ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
查看>>