使用hutool工具对象转json字符串时null值导致属性丢失问题
最近在写接口交互时,需要把json字符串传递给第三方,第三方时有报错说少属性字段,经过调试发现,在将对象转换成json传递时,属性值来源于库字段值,当数据库字段值为null时,转json会导致转换出来的json字符串没有这个属性key,使用的工具是hutool工具,方法是JSONUtil.toJsonStr()
User user = new User(); user.setName("haha"); user.setHobby(null); System.out.println(JSONUtil.toJsonStr(user));
得到的结果:
{"name":"haha"}
发现没有hobby属性,查看使用的方法
public static String toJsonStr(Object obj) { return toJsonStr(obj, (JSONConfig)null); } public static String toJsonStr(Object obj, JSONConfig jsonConfig) { if (null == obj) { return null; } else { return obj instanceof CharSequence ? StrUtil.str((CharSequence)obj) : toJsonStr(parse(obj, jsonConfig)); } } public static void toJsonStr(Object obj, Writer writer) { if (null != obj) { toJsonStr(parse(obj), writer); } }
发现使用的是第一个方法,该方法还有多个方法重载,再看第二个方法的第二个参数JSONConfig,还可以在转json做附加配置,JSONConfig类还有多个属性
private static final long serialVersionUID = 119730355204738278L; private Comparator<String> keyComparator; private boolean ignoreError; private boolean ignoreCase; private String dateFormat; private boolean ignoreNullValue = true; private boolean transientSupport = true; private boolean stripTrailingZeros = true; private boolean checkDuplicate;
忽略空值属性ignoreNullValue默认情况是true,知道了这些属性,我们就可以在转换json时根据不同的需求做配置
User user = new User(); user.setName("haha"); user.setHobby(null); JSONConfig jsonConfig = new JSONConfig(); jsonConfig.setIgnoreNullValue(false); System.out.println(JSONUtil.toJsonStr(user, jsonConfig));
最终得到结果:
{"name":"haha","hobby":null}
以上方法是hutool工具类提供,且适用于高版本的hutool工具类;
以下再介绍一类fastjson的转换方式:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(""); } }); String jsonStr = objectMapper.writeValueAsString(zfbzZfcxVo);
setSerializationInclusion参数设置为JsonInclude.Include.ALWAYS,同样可以将属性值null转换成字符串的空值""