Jackson教程

Jackson 库简介

Jackson 是一个高效的 Java 库,用于处理 JSON 数据格式。它支持 JSON 的序列化(Java 对象转 JSON)和反序列化(JSON 转 Java 对象),并提供注解、流式 API 等功能,适用于多种场景如 REST API、数据存储等。


核心模块

  • jackson-core:提供底层流式 API(JsonParserJsonGenerator)。
  • 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();


自定义序列化/反序列化

实现 JsonSerializerJsonDeserializer 接口:

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);


常见问题

  1. 日期格式化
    全局配置日期格式:

    mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
    

  2. 循环引用
    使用 @JsonIdentityInfo 解决对象循环引用:

    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
    class User {
        private int id;
        private User friend; // 可能循环引用
    }
    

  3. 性能优化
    重用 ObjectMapper 实例(线程安全),避免重复创建。


通过掌握以上内容,可以高效利用 Jackson 处理 JSON 数据。更多高级功能可参考官方文档或扩展模块(如 XML 处理、YAML 支持等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值