版权说明: 本文由博主keep丶原创,转载请注明出处。
原文地址: https://blog.csdn.net/qq_38688267/article/details/124614982
背景
因公司要求,将项目中的FastJson
移除,改为用Jackson
;因此需要将代码中的JSONObject
相关操作替换成Jackson
中的对象:JsonNode
。
FastJson对应的Jackson相关对象/操作
对象/操作 | FastJson | Jackson |
---|---|---|
json对象 | JSONObject | ObjectNode |
json集合 | JSONArrray | ArrayNode |
创建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;
}