fastjson-对象转json字符串时保留空字段SerializerFeature无效的问题

需求简述

将java实体类转换为json字符串,空字段也需要转换。

问题说明

用fastjson将java对象转json字符串时默认去除空字段,网上查阅一番,都说转的时候添加SerializerFeature.WriteNullStringAsEmpty参数就行,亲测了一下,没有达到效果(原因未知)。
如下例子:AssessReq 还有个caseId字段特意不设置值

AssessReq ar= new AssessReq();
ar.setAge(11);
ar.setUsername("test");
logger.info("Json =>> " + JSON.toJSONString(ar, SerializerFeature.WriteNullStringAsEmpty);

输出结果:

testJson =>> {"age":11,"username":"test"}

结果可见,caseId字段并有保留。SerializerFeature.WriteMapNullValue 也试过了也是不不行。

解决方案

后面换了种方法才解决的,解决方法如下:

// 自定义空字段处理规则
ValueFilter filter = (obj, s, v) -> {
	if (v == null) {
	        logger.info("s =>> "+s);
	        return "";
	    }
	    return v;
	};
AssessReq ar= new AssessReq();
ar.setAge(11);
ar.setUsername("test");
logger.info("testJson =>> " + JSON.toJSONString(ar, filter));

输出结果:

testJsonn =>> {"age":11,"caseId":"","username":"test"}

结果可见,是可以实现预期的效果的。

—————————————————————————————————————————————————————————
—————————————————————————————————————————————————————————
2021-04-21补充:
评论区大佬说的做法更好,亲测有效!
User:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private Integer age;
    private Address address;
}

Address:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {
    private String privince;
    private String city;
}

测试:

Addressaddress= new Address();
address.setCity("深圳");

User user = new User();
user.setName("小明");
user.setAddress(address);

// 直接输出json
System.out.println("user =>> " + JSON.toJSONString(user));
// 转json时加SerializerFeature参数
SerializerFeature[] feature= {SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteNullNumberAsZero};
System.out.println("user =>> " + JSON.toJSONString(user, feature));

输出结果:

user =>> {"address":{"city":"深圳"},"name":"小明"}
user =>> {"address":{"city":"深圳","privince":""},"age":0,"hobbys":null,"name":"小明"}

由上可见,这种方法更好更简洁,推荐使用!!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值