Appearance
Jackson 简介
相关文档
Jackson 的组件
核心模块
- Streaming:jackson-core jar,定义了底层的 streaming API 和实现了 Json 特性。
- Annotations:jackson-annotations jar,包含了标准的 Jackson 注解。
- Databind:jackson-databind jar,实现了数据绑定和对象序列化,它依赖于 streaming 和 annotations 的包
第三方数据类型模块
这些扩展是插件式的 Jackson 模块,用 ObjectMapper.registerModule() 注册,并且通过添加 serializers 和 deserializers 以便 Databind 包(ObjectMapper / ObjectReader / ObjectWriter)可以读写这些类型,来增加对各种常用的Java库的数据类型的支持。
数据格式模块
Jackson 也有处理程序对 JAX-RS 标准实现者例如 Jersey, RESTeasy, CXF 等提供了数据格式支持。处理程序实现了 MessageBodyReader 和 MessageBodyWriter,目前支持的数据格式包括 JSON, Smile, XML, YAML和 CBOR。
数据格式提供了除了 Json 之外的数据格式支持,它们绝大部分仅仅实现了 streaming API abstractions,以便数据绑定组件可以按照原来的方式使用。另一些(几乎不需要)提供了 databind 标准功能来处理,例如 schemas。
Jackson 基础使用
引入 maven 依赖
xml
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.1</version>
</dependency>序列化对象成 JSON 字符串
java
public void toJson() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
City case1 = new City();
case1.setCity("GZ");
case1.setAge(123);
String jsonStr = mapper.writeValueAsString(case1);
System.out.println("JSON:" + jsonStr);
}
// 输出:JSON:{"city":"GZ","age":123}反序列化 JSON 字符串成 Java 对象
java
public void toObj() throws JsonParseException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
String inputjsonstr = "{\"city\":\"GZ\",\"age\":123}";
City readcase = mapper.readValue(inputjsonstr, City.class);
System.out.println("city info:" + readcase);
}如果里面有未知属性,比如 json 中有 desc 字段,但是 City 类中没有相应字段,会报错,需要如下设置:
java
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);常用注解
@JsonProperty("xxx"):将当前的属性名在 json 字符串中重新命名为当前设置的值。比如将 age 转为 mAge@JsonIgnore:将被标注的属性在生成 json 字符串的时候,直接忽略。@JsonInclude:是一个类级别的设置,JsonInclude.Include.NON_EMPTY标识只有非 NULL 的值才会被纳入 json string 之中,其余的都被忽略,比如这里的 location 属性,并没有出现在最终的结果字符串中。@JsonSerialize:使用自定义的类来实现自定义的字段转换。(用于写入操作)@JsonDeserialize:解析的时候,自定义的转换器。(用于读取操作)@JsonAutoDetect:设置类的访问策略,是否所有的属性都可以,还是按照一定的方式来提取。@JsonRawValue:无转换的将属性值写入到 json 字符串中。(用于写入操作)@JsonValue:标注方法,用以替代缺省的方法,由该方法来完成 json 的字符输出。