Gson对字符串null的字段转换为空字符串输出
来源:互联网 发布:2016淘宝618报名入口 编辑:程序博客网 时间:2024/04/25 22:15
最近有个项目需要将后端数据以json方式传给前端。但是如果后端有字段为null,使用原始的new Gson()就排除为null的字段,不传给前端。缺少字段前端会报错。于是就按照网上方法使用了new GsonBuilder().serializeNulls()。好吧,现在每个字段都能传给前端了,但是有个潜在不足,就是为null的字段实际变成了"null"字符串给前端了。
对于严谨的程序员来说,这个不能忍。于是就想找到一个更完美的方法。
先说下网上目前存在的两种方法:
1、写一个NullStringToEmptyAdapterFactory,然后使用new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory())。
2、new TypeAdapter内部类,然后使用new GsonBuilder().registerTypeAdapter(String.class, STRING)。
然后我都试了,方法一却根本没有效果,方法二还报错。
如果你试了上面两个中的任意一种方法都成功了,恭喜你,可以直接进入源码分析阶段。
如果你不幸地和我一样,还是不行,我想你可能跟我一样,遇到gson jar包问题!有问题的是gson-2.2.1.jar版本。
研究了一下源码,找到了上面两个方法都不行的原因。
方法二报错是因为源码不允许用户自定义基本类型和封装类型。方法一虽然注册了adapter工厂,谷歌依然没有使用自定义的adapter。
if (!Primitives.isPrimitive(type) && !Primitives.isWrapperType(type) && type != String.class){}else{throw new IllegalArgumentException("Cannot register type adapters for " + type);}
在gson-2.2.2以后的版本就已经没有了上面的代码,允许注册自定义adapter。
我升级了gson版本,使用gson-2.5,但是依然没有输出空字符串,于是我又去看源码了。
一开始我参考某篇文章,在publicvoidwrite(JsonWriterwriter,Stringvalue)中写了如下代码:
if (value == null){ writer.nullValue(); return;}
这就是问题所在。
序列化使用的是adapter的write方法,反序列化使用的是read方法,所以在write方法里应该写
if (value == null){ writer.value(""); return;}
终于解决了问题。
现在来总结一下怎么完美地解决null字段以空字符串输出。只需要定义一个静态adapter常量,注册到GsonBuilder即可。网上那些定义NullStringToEmptyAdapterFactory和StringNullAdapter类根本就不必要。
为什么?源代码中写了,自定义adapter后,gson会再构造成adapterFactory注册的。
if(typeAdapter instanceof TypeAdapter){ this.factories.add(TypeAdapters.newFactory(TypeToken.get(type), (TypeAdapter)typeAdapter));}
最后给一下最终代码样例:
- Gson对字符串null的字段转换为空字符串输出
- Gson解析null替换为空字符串
- Gson解析null替换为空字符串
- Gson解析null替换为空字符串
- Gson解析null替换为空字符串
- Gson解析null替换为空字符串
- SpringMVC统一转换null值为空字符串的方法
- SpringMVC统一转换null值为空字符串的方法
- SpringMVC统一转换null值为空字符串的方法
- SpringMVC统一转换null值为空字符串的方法
- Gson解析或者转换对象成json字符串时,String为NULL转空字符串处理方案
- Spring mvc jackson输出null为空字符串、单引号、字段和数字加引号
- Access 中值为空字符串字段与值为null字段的查询问题
- JSON的null转换成空字符串
- Spring mvc3 jackson输出null为空字符串问题
- Spring mvc jackson输出null为空字符串、单引号、字段和数字加引号问题Spring mvc3 jackson输出null为空字符串、单引号、字段和数字加引号问题
- s:if 标签判断Action中的字段是否为null或者空字符串的方法
- 07-s:if 标签判断Action中的字段是否为null或者空字符串的方法
- rtems源码贡献步骤
- Android中关于menu(菜单)的创建与使用
- Android入门之——百度地图开发(一)
- Oracle监听日志频繁报unknown connect data 12537错误诊断
- Handler作为Activity的内部类所引起的内存泄露问题
- Gson对字符串null的字段转换为空字符串输出
- 【第6题】360校园招聘2015届技术类笔试题
- ccf/201409-3 /字符串匹配---java
- 紫书搜索 习题7-3 UVA
- android中fragment出现replace方法参数不匹配
- 函数模板---上
- java 观察者模式
- REPLACE INTO 和 INSERT INTO ... ON DUPLICATE KEY UPDATE SET ...
- 【第7题】360校园招聘2015届技术类笔试题