Jackson 库简介
Jackson 是一个高效的 Java 库,用于处理 JSON 数据格式。它支持 JSON 的序列化(Java 对象转 JSON)和反序列化(JSON 转 Java 对象),并提供注解、流式 API 等功能,适用于多种场景如 REST API、数据存储等。
核心模块
- jackson-core:提供底层流式 API(
JsonParser
和JsonGenerator
)。 - jackson-databind:实现对象与 JSON 的互转(依赖
jackson-core
)。 - jackson-annotations:提供注解功能(如
@JsonIgnore
)。
基本用法
添加依赖(Maven)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
对象转 JSON(序列化)
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(myObject);
JSON 转对象(反序列化)
MyClass obj = mapper.readValue(jsonString, MyClass.class);
常用注解
@JsonProperty
:指定 JSON 字段名。@JsonProperty("user_name") private String userName;
@JsonIgnore
:忽略字段。@JsonFormat
:格式化日期。@JsonFormat(pattern = "yyyy-MM-dd") private Date birthDate;
@JsonInclude
:忽略空值。@JsonInclude(JsonInclude.Include.NON_NULL) private String optionalField;
处理复杂场景
泛型反序列化
使用 TypeReference
处理泛型集合:
List<MyClass> list = mapper.readValue(json, new TypeReference<List<MyClass>>() {});
忽略未知字段
配置 ObjectMapper
忽略 JSON 中的未知字段:
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
美化输出
启用缩进格式化:
String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
流式 API(高性能场景)
直接生成或解析 JSON 流,适用于大文件:
JsonFactory factory = new JsonFactory();
JsonGenerator generator = factory.createGenerator(new File("output.json"), JsonEncoding.UTF8);
generator.writeStartObject();
generator.writeStringField("key", "value");
generator.writeEndObject();
generator.close();
自定义序列化/反序列化
实现 JsonSerializer
或 JsonDeserializer
接口:
public class CustomSerializer extends JsonSerializer<MyClass> {
@Override
public void serialize(MyClass value, JsonGenerator gen, SerializerProvider provider) {
gen.writeString(value.toString());
}
}
注册自定义处理器:
SimpleModule module = new SimpleModule();
module.addSerializer(MyClass.class, new CustomSerializer());
mapper.registerModule(module);
常见问题
-
日期格式化:
全局配置日期格式:mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
-
循环引用:
使用@JsonIdentityInfo
解决对象循环引用:@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") class User { private int id; private User friend; // 可能循环引用 }
-
性能优化:
重用ObjectMapper
实例(线程安全),避免重复创建。
通过掌握以上内容,可以高效利用 Jackson 处理 JSON 数据。更多高级功能可参考官方文档或扩展模块(如 XML 处理、YAML 支持等)。