Jackson Json工具的使用总结
Jackson的主要模块
- Streaming jackson-core 定义了低级流式处理 API,并包括特定于 JSON 的实现
- Annotations jackson-annotations 包含标准的 Jackson 注释
- Databind jackson-databind 实现数据绑定,依赖于streaming和Annotations
使用例子
1. 在缓存中序列化和反序列化
在缓存的场景下,在反序列化时,需要创建与序列化时相同的类对象。 这种情况下需要在序列化时写入对象的类型信息。
进行如下配置:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.activateDefaultTyping(BasicPolymorphicTypeValidator
.builder()
.allowIfBaseType(Object.class)
.build(), ObjectMapper.DefaultTyping.NON_FINAL);
序列化后的数据中带有类型信息
2. JsonNode获取
String json = "{\"a\": 1, \"b\":{\"c\":2}}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode node = objectMapper.readTree(json);
System.out.println(node.path("b").path("d").asText(""));//不会报空指针
System.out.println(node.path("b").path("c").asText(""));
从JsonNode获取节点时有2种情况:
- node不存在,get方法返回null,path方法会返回MissingNode;
- 节点的值为null,此时会返回一个NullNode
使用path而不是get方法可以避免NPE
3. JsonProperty的使用
标记注解可用于将非静态方法定义为逻辑属性访问器的“setter”或“getter”(取决于其签名),或者将非静态对象字段定义为逻辑属性(用于赋值或获取值)(序列化、反序列化)。
主要属性:
- value()
定义逻辑字段名 - access()
修改getter、setter、字段的可见性- AUTO 自动
- READ_ONLY 只读,只用于序列化,不用于反序列化
- WRITE_ONLY 只写,只用于反序列化,不用于序列化
- READ_WRITE 读和写
使用例子:
在get方法上使用,但这个属性没有对应的set方法,需用指定为Access.READ_ONLY,否则该实体列在反序列化是会报错(默认配置的情况下)
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
public Map<String, Boolean> getPermissionMap() {
if (this.permissions == null || this.permissions.isEmpty()) {
return Collections.emptyMap();
}
Map<String, Boolean> map = new HashMap<>(this.permissions.size(), 1.0f);
for (String permission : this.permissions) {
map.put(permission, true);
}
return map;
}

浙公网安备 33010602011771号