Jackson对应FastJson的JSONObject的对象JsonNode详解

版权说明: 本文由博主keep丶原创,转载请注明出处。
原文地址: https://blog.csdn.net/qq_38688267/article/details/124614982

背景

  因公司要求,将项目中的FastJson移除,改为用Jackson;因此需要将代码中的JSONObject相关操作替换成Jackson中的对象:JsonNode

FastJson对应的Jackson相关对象/操作

对象/操作FastJsonJackson
json对象JSONObjectObjectNode
json集合JSONArrrayArrayNode
创建json对象JSON.parseObject()ObjectMapper.readTree()
获取json对象中的json对象jsonObject.getJSONObject(<KEY>)jsonNode.with(<KEY>)
获取json对象中的集合对象jsonObject.getJSONArray(<KEY>)jsonNode.withArray(<KEY>)

  

JsonNode使用注意点

应定义全局ObjectMapper

  在解析json字符串时,FastJson可以直接通过静态类进行转换,Jackson转换json字符串需要用到ObjectMapper类,有些同学可能会每次需要转换时,就new一个ObjectMapper,这样是不可取的,一方面是性能问题,另一方面是ObjectMapper在初始化时,是可以定义很多配置的。

  因此一般情况下需要将ObjectMapper定义为一个bean,在需要用到的时候注入。如果项目上存在几种不同的序列化方式,则可以定义多个ObjectMapper的bean,这样在使用时会更方便。
  

jsonNode.with()和jsonNode.withArray()注意点

  调用这两个方法时,如果传入的Key不存在的话,会在这个Json对象中创建一个名字为Key的属性,值为{}(with方法)或[](withArray方法)。例:

// jsonNode的值假设为:{"a":123,"b":456}
ObjectNode c = jsonNode.with("c");
// 此时c的值为:{},jsonNode的值为:{"a":123,"b":456,"c":{}}
// jsonNode的值假设为:{"a":123,"b":456}
ArrayNode c = jsonNode.withArray("c");
// 此时c的值为:[],jsonNode的值为:{"a":123,"b":456,"c":[]}

  因此如果不是确定有这个字段的情况下,可以先用JsonNode.has()方法判断一下是否存在该字段。这个特点在一定情况下也可以妙用。
  

补充

ObjectMapper配置类样例:

    @Bean
    public ObjectMapper defaultMapperCreator() {
            ObjectMapper mapper = new ObjectMapper();
            mapper.registerModule(new JavaTimeModule()).registerModule(new ParameterNamesModule()).registerModules(ObjectMapper.findModules());
            //是否允许使用注释
//        mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
            //字段允许去除引号
//        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
            //允许单引号
//        mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
            //允许转义字符
//        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
            //严格重复检测
//        mapper.configure(JsonParser.Feature.STRICT_DUPLICATE_DETECTION, true);
            //不检测失败字段映射
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            //时间字段输出时间戳
            mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
            //时间输出为毫秒而非纳秒
            mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
            //空对象不出错
            mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
            //时间读取为毫秒而非纳秒
            mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
            //不输出空值字段
            mapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
            mapper.setTimeZone(systemTimeZone);

//        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

            return mapper;
     }
  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值