欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Gson转换空值字符时,最后json数据中无这个字段

程序员文章站 2022-03-13 12:52:47
...

 

 JSON 字符串的形式

{
   "name": "mafly",
   "age": "18",
   "sex": "男"
}

 

用于转换Java对象为 Json 字符串和把 Json 字符串转换为对象的工具类有很多,Gson、Jackson、FastJson等,我们用的是 Gson, 它是 Google 开发的,还据传说它的性能比较强大一些。嗯,对,我们用的就是这个。先看示例代码:

public static void main(String[] args) {

   HashMap<String, Object> map = new HashMap<String, Object>();
   map.put("name", "mafly");
   map.put("age", "18");
   map.put("sex", null);

   String jsonString = new Gson().toJson(map);
   System.err.println(jsonString);
}

你猜会输出上面那段我们预期的 Json 串吗?然而并不会。

输出没有sex属性!!!!!!!!

就是这个当 Sex=null时,用 Gson 的tojson方法会把 null 值忽略,从而序列化之后输出不包含这个属性值的 Json 串。其实我们的预期是输出 {"sex": ""} 或 {"sex": null}, 那怎么做呢?

通过搜索引擎发现,网上大概存在以下三种解决方案:

  • 调用 toJson(Object src, Type typeOfSrc, JsonWriter writer) 方法

  • 注册自定义 TypeAdapter

  • 设置 serializeNulls 属性值(推荐)

前两种方式我没测试,推荐第三种方式,简单方便,源码如下:

GsonBuilder gsonBuilder = new GsonBuilder();
String jsonString1 = gsonBuilder.serializeNulls().create().toJson(map);
System.err.println(jsonString1);

输出符合我们的需求了, {"sex": null},

 

简单转到源码看了看,除了这一个设置还有很多,真是太方便了。调用serializeNulls()后, Gson 设置 serializeNulls 属性值为 true,默认是false,源码:

public GsonBuilder serializeNulls() {
   this.serializeNulls = true;
   return this;
}

重新认识一下 Gson

我看了几行 Gson 的源码后,我发现它可配置及特性多的数不胜数,可以用@SerializedName注解给属性重命名,用@Expose注解标识属性不进行序列化,支持 Map 的 key 为复杂对象的形式,日期类型转化为特定格式,还有区分版本进行显示,这些在日常项目中都极常用到,只不过好像我们之前都是自己实现的。

我简单建立了一个 UserInfo 实体类,里边包含了username、age、sex这三个属性值。试着测试了一下其中一两个:

[email protected] 想让谁输出谁输出,注解代码如图:

 

设置excludeFieldsWithoutExposeAnnotation(),看下面第三行是输出:

 

[email protected] 想怎么显示怎么显示,注解代码如图:

 

我想把age再 Json序列化时显示maflyAge,现在就可以了,输出如下图:

 

[email protected]、@Until 不同版本不同数据,注解代码如图:

 

这里要设置setVersion(3.2),@Since标注的在 3.2 版本或之后才会输出,@Until标注的只在 3.2 版本前才有。效果输出如下图:

 

当然,还有好多特性呢,比如字段首字母大写阿、结果格式化阿等等,我这里抛个砖,剩下的有需要的可以试试。

 

相关标签: Gson