版权说明: 本文由博主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;
     }
GitHub 加速计划 / fastj / fastjson
25.69 K
6.51 K
下载
FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
最近提交(Master分支:3 个月前 )
c942c834 - 1 年前
5bc4709b - 1 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐