0
点赞
收藏
分享

微信扫一扫

java 实体类的jackson注解

少_游 2023-08-01 阅读 80

Java 实体类的 Jackson 注解

在 Java 开发中,我们经常需要将对象序列化为 JSON 格式的字符串以便进行网络传输或持久化存储。Jackson 是一个非常流行的 Java 库,它提供了强大的对象序列化和反序列化功能。通过使用 Jackson 注解,我们可以更灵活、简洁地控制对象的序列化和反序列化过程。

什么是 Jackson?

Jackson 是一个开源的 Java 库,用于处理 JSON 数据。它提供了一系列的注解,可以用于控制对象与 JSON 数据之间的映射关系。Jackson 使用简单且高效,在 Java 社区中得到了广泛的应用。

常用的 Jackson 注解

下面是一些常用的 Jackson 注解及其作用:

  1. @JsonIgnore: 用于标记某个字段或方法不参与序列化或反序列化过程。
  2. @JsonProperty: 用于指定字段或方法在 JSON 中的名称。
  3. @JsonFormat: 用于指定日期时间字段的格式。
  4. @JsonInclude: 用于控制序列化时是否包含某个字段。
  5. @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

举报

相关推荐

0 条评论