需求简述
将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":"小明"}
由上可见,这种方法更好更简洁,推荐使用!!