Java 实体类的 Jackson 注解
在 Java 开发中,我们经常需要将对象序列化为 JSON 格式的字符串以便进行网络传输或持久化存储。Jackson 是一个非常流行的 Java 库,它提供了强大的对象序列化和反序列化功能。通过使用 Jackson 注解,我们可以更灵活、简洁地控制对象的序列化和反序列化过程。
什么是 Jackson?
Jackson 是一个开源的 Java 库,用于处理 JSON 数据。它提供了一系列的注解,可以用于控制对象与 JSON 数据之间的映射关系。Jackson 使用简单且高效,在 Java 社区中得到了广泛的应用。
常用的 Jackson 注解
下面是一些常用的 Jackson 注解及其作用:
@JsonIgnore
: 用于标记某个字段或方法不参与序列化或反序列化过程。@JsonProperty
: 用于指定字段或方法在 JSON 中的名称。@JsonFormat
: 用于指定日期时间字段的格式。@JsonInclude
: 用于控制序列化时是否包含某个字段。@JsonDeserialize
和@JsonSerialize
: 用于指定自定义的序列化和反序列化类。
示例
假设我们有一个 User 类,包含了用户的姓名、年龄和生日。我们希望将 User 对象序列化为以下格式的 JSON 字符串:
{
"name": "Alice",
"age": 25,
"birthday": "1996-01-01"
}
首先,我们需要在类上添加 @JsonIgnoreProperties(ignoreUnknown = true)
注解,以忽略在 JSON 中不存在的字段。
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
private String name;
private int age;
private LocalDate birthday;
}
接下来,我们可以使用 @JsonProperty
注解来指定字段在 JSON 中的名称。同时,我们使用 @JsonFormat
注解来指定日期字段的格式。
public class User {
@JsonProperty("name")
private String name;
@JsonProperty("age")
private int age;
@JsonProperty("birthday")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate birthday;
}
现在,我们可以通过以下代码将 User 对象序列化为 JSON 字符串:
ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
user.setName("Alice");
user.setAge(25);
user.setBirthday(LocalDate.of(1996, 1, 1));
String json = objectMapper.writeValueAsString(user);
System.out.println(json);
输出结果为:
{
"name": "Alice",
"age": 25,
"birthday": "1996-01-01"
}
同样,我们可以通过以下代码将 JSON 字符串反序列化为 User 对象:
String json = "{\"name\":\"Alice\",\"age\":25,\"birthday\":\"1996-01-01\"}";
User user = objectMapper.readValue(json, User.class);
System.out.println(user.getName());
System.out.println(user.getAge());
System.out.println(user.getBirthday());
输出结果为:
Alice
25
1996-01-01
自定义序列化和反序列化类
有时候,我们需要对特定的字段进行自定义的序列化和反序列化操作。Jackson 提供了 @JsonDeserialize
和 @JsonSerialize
注解,用于指定自定义的序列化和反序列化类。
public class User {
private String name;
private int age;
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate birthday;
}
上述代码中,我们使用 @JsonDeserialize
注解指定了 LocalDateDeserializer
类来反序列化 birthday
字段。
public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
@Override
public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
String dateString = jsonParser.getText();
return LocalDate.parse(dateString, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
}
LocalDateDeserializer
类继承了 JsonDeserializer
类,并重写了 deserialize
方法,用于自定义反序列化逻辑。
类似地,我们可以使用 @JsonSerialize
注解指定自定义的序列化类。
总结
通过 Jackson 注解,我们可以更灵活、简洁地控制 Java