版权说明: 本文由博主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方法)。例:
ObjectNode c = jsonNode.with("c");
ArrayNode c = jsonNode.withArray("c");
??因此如果不是确定有这个字段的情况下,可以先用JsonNode.has() 方法判断一下是否存在该字段。这个特点在一定情况下也可以妙用。 ??
补充
ObjectMapper配置类样例:
@Bean
public ObjectMapper defaultMapperCreator() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule()).registerModule(new ParameterNamesModule()).registerModules(ObjectMapper.findModules());
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);
return mapper;
}
|