版权说明: 本文由博主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;
}
|