Skip to content

Jackson使用指南 ​

Jackson是Java生态中最流行的JSON处理库,提供了强大的JSON处理能力。本文详细介绍Jackson的使用方法和最佳实践。

📋 目录 ​

🎯 一、Maven依赖 ​

1.1 添加依赖 ​

xml
<!-- Jackson核心 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.16.0</version>
</dependency>

<!-- Jackson注解 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.16.0</version>
</dependency>

<!-- Jackson XML支持 -->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.16.0</version>
</dependency>

🎯 二、基本使用 ​

2.1 ObjectMapper ​

创建ObjectMapper:

java
import com.fasterxml.jackson.databind.ObjectMapper;

// 创建ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();

// 配置ObjectMapper
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

2.2 对象序列化 ​

序列化为JSON字符串:

java
// 创建对象
User user = new User("张三", 25, "zhangsan@example.com");

// 序列化为JSON字符串
String json = objectMapper.writeValueAsString(user);
// 结果:{"name":"张三","age":25,"email":"zhangsan@example.com"}

// 序列化为JSON(格式化输出)
String prettyJson = objectMapper.writerWithDefaultPrettyPrinter()
    .writeValueAsString(user);

// 序列化到文件
objectMapper.writeValue(new File("user.json"), user);

// 序列化到输出流
objectMapper.writeValue(new FileOutputStream("user.json"), user);

序列化示例:

java
// 复杂对象序列化
public class Order {
    private Long orderId;
    private List<OrderItem> items;
    private BigDecimal totalAmount;
    private Date createTime;
    
    // getter和setter
}

Order order = new Order();
// ... 设置属性

String json = objectMapper.writeValueAsString(order);

2.3 对象反序列化 ​

从JSON字符串反序列化:

java
String json = "{\"name\":\"张三\",\"age\":25,\"email\":\"zhangsan@example.com\"}";

// 反序列化
User user = objectMapper.readValue(json, User.class);

// 从文件反序列化
User user2 = objectMapper.readValue(new File("user.json"), User.class);

// 从输入流反序列化
User user3 = objectMapper.readValue(
    new FileInputStream("user.json"), 
    User.class
);

// 从URL反序列化
User user4 = objectMapper.readValue(
    new URL("http://example.com/user.json"),
    User.class
);

泛型反序列化:

java
// 反序列化为List
String json = "[{\"name\":\"张三\"},{\"name\":\"李四\"}]";
List<User> users = objectMapper.readValue(
    json,
    new TypeReference<List<User>>() {}
);

// 反序列化为Map
String json2 = "{\"user1\":{\"name\":\"张三\"},\"user2\":{\"name\":\"李四\"}}";
Map<String, User> userMap = objectMapper.readValue(
    json2,
    new TypeReference<Map<String, User>>() {}
);

2.4 JSON节点操作 ​

JsonNode操作:

java
String json = "{\"name\":\"张三\",\"age\":25,\"address\":{\"city\":\"北京\"}}";

// 解析为JsonNode
JsonNode rootNode = objectMapper.readTree(json);

// 获取字段值
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();

// 获取嵌套字段
String city = rootNode.get("address").get("city").asText();

// 判断字段是否存在
boolean hasName = rootNode.has("name");

// 获取数组节点
JsonNode arrayNode = rootNode.get("items");
if (arrayNode.isArray()) {
    for (JsonNode item : arrayNode) {
        // 处理数组元素
    }
}

// 转换为对象
User user = objectMapper.treeToValue(rootNode, User.class);

🎯 三、注解使用 ​

3.1 常用注解 ​

@JsonProperty:

java
public class User {
    @JsonProperty("user_name")
    private String name;
    
    @JsonProperty("user_age")
    private Integer age;
    
    // 序列化时包含,反序列化时忽略
    @JsonProperty(value = "email", access = JsonProperty.Access.READ_ONLY)
    private String email;
}

// JSON: {"user_name":"张三","user_age":25}

@JsonIgnore:

java
public class User {
    private String name;
    
    @JsonIgnore
    private String password;  // 序列化和反序列化时忽略
    
    @JsonIgnore(serialize = true, deserialize = false)  // 仅反序列化时忽略
    private String secret;
}

@JsonFormat:

java
public class Order {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private BigDecimal amount;
    
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate orderDate;
}

@JsonInclude:

java
@JsonInclude(JsonInclude.Include.NON_NULL)  // 忽略null值
public class User {
    private String name;
    private Integer age;
    private String email;  // 如果为null,不会出现在JSON中
}

// 或者配置ObjectMapper
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

@JsonIgnoreProperties:

java
@JsonIgnoreProperties({"password", "secret"})  // 忽略多个字段
public class User {
    private String name;
    private String password;
    private String secret;
}

// 忽略未知属性(反序列化时)
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    // ...
}

@JsonPropertyOrder:

java
@JsonPropertyOrder({"age", "name", "email"})  // 指定序列化顺序
public class User {
    private String name;
    private Integer age;
    private String email;
}

3.2 集合和Map注解 ​

集合处理:

java
public class Order {
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private List<OrderItem> items;
    
    @JsonDeserialize(contentAs = OrderItem.class)
    private List<OrderItem> items2;
}

Map处理:

java
public class User {
    @JsonFormat(shape = JsonFormat.Shape.OBJECT)
    private Map<String, String> attributes;
    
    @JsonAnySetter  // 反序列化时,未知属性放入Map
    private Map<String, Object> extraProperties = new HashMap<>();
    
    @JsonAnyGetter  // 序列化时,将Map中的属性展开
    public Map<String, Object> getExtraProperties() {
        return extraProperties;
    }
}

🎯 四、自定义序列化 ​

4.1 自定义序列化器 ​

实现自定义序列化器:

java
// 自定义序列化器
public class CustomDateSerializer extends JsonSerializer<Date> {
    private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    
    @Override
    public void serialize(Date date, JsonGenerator gen, SerializerProvider serializers)
            throws IOException {
        gen.writeString(formatter.format(date));
    }
}

// 使用自定义序列化器
public class Order {
    @JsonSerialize(using = CustomDateSerializer.class)
    private Date createTime;
}

4.2 自定义反序列化器 ​

实现自定义反序列化器:

java
// 自定义反序列化器
public class CustomDateDeserializer extends JsonDeserializer<Date> {
    private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    
    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException {
        try {
            return formatter.parse(p.getText());
        } catch (ParseException e) {
            throw new IOException(e);
        }
    }
}

// 使用自定义反序列化器
public class Order {
    @JsonDeserialize(using = CustomDateDeserializer.class)
    private Date createTime;
}

🎯 五、高级特性 ​

5.1 ObjectMapper配置 ​

常用配置:

java
ObjectMapper mapper = new ObjectMapper();

// 反序列化配置
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);

// 序列化配置
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);  // 格式化输出

// 日期格式配置
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));

// 忽略null值
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

// 属性命名策略
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

5.2 多态处理 ​

@JsonTypeInfo和@JsonSubTypes:

java
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class, name = "dog"),
    @JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public abstract class Animal {
    private String name;
}

public class Dog extends Animal {
    private String breed;
}

public class Cat extends Animal {
    private boolean indoor;
}

5.3 树模型操作 ​

树模型使用:

java
// 创建JSON树
ObjectMapper mapper = new ObjectMapper();
ObjectNode root = mapper.createObjectNode();
root.put("name", "张三");
root.put("age", 25);

ObjectNode address = mapper.createObjectNode();
address.put("city", "北京");
address.put("street", "中关村");
root.set("address", address);

ArrayNode hobbies = mapper.createArrayNode();
hobbies.add("读书");
hobbies.add("编程");
root.set("hobbies", hobbies);

// 转换为JSON字符串
String json = mapper.writeValueAsString(root);

// 从JSON字符串创建树
JsonNode tree = mapper.readTree(json);

📖 学习资源 ​

官方文档 ​

网站资源 ​

✅ 学习检查清单 ​

  • [ ] 已掌握ObjectMapper的基本使用
  • [ ] 已熟悉常用注解
  • [ ] 已了解自定义序列化器
  • [ ] 已掌握高级特性配置
  • [ ] 已了解多态处理

上一章节:Apache Commons使用
下一章节:其他工具包使用
返回目录:代码规范