追枫狼

导航

使用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转换成字符串的空值""

 

posted on 2023-04-17 16:17  追枫狼  阅读(2453)  评论(0编辑  收藏  举报