反序列化注解

@JsonCreator

用于指定一个构造方法,用于反序列化。

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String username;
    private Integer age;

    @JsonCreator
    public User(@JsonProperty("name") String username, @JsonProperty("age") Integer age) {
        this.username = username;
        this.age = age;
    }
}
String userStr = "{\"name\":\"job\",\"age\":18}";
User user = objectMapper.readValue(userStr, User.class);
// 打印结果:User(username=job, age=18)

@JacksonInject

用于指定一个属性,用于注入值。而不是从 JSON 中读取。

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String username;
    private Integer age;

    @JacksonInject
    private String city;
}
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setInjectableValues(new InjectableValues.Std().addValue(String.class, "beijing"));
String userStr = "{\"username\":\"job\",\"age\":18}";
User user = objectMapper.readValue(userStr, User.class);
// 打印结果:User(username=job, age=18, city=beijing)

@JsonAnySetter

用于指定一个方法,用于反序列化时,将未知的属性值存储到一个 Map 对象中。

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String username;
    private Integer age;
    private Map<String, String> properties = new HashMap<>();

    @JsonAnySetter
    public void set(String key, String value) {
        properties.put(key, value);
    }
}
String userStr = "{\"username\":\"job\",\"age\":18,\"city\":\"beijing\"}";
User user = objectMapper.readValue(userStr, User.class);
// 打印结果:User(username=job, age=18, properties={city=beijing})

@JsonSetter

用于指定一个方法,用于反序列化时,将属性值设置到指定的属性中。

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String username;
    private Integer age;

    @JsonSetter("name")
    public void setUsername(String username) {
        this.username = username;
    }
}
String userStr = "{\"name\":\"job\",\"age\":18}";
User user = objectMapper.readValue(userStr, User.class);
// 打印结果:User(username=job, age=18)

@JsonDeserialize

用于指定自定义的反序列化器。

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String username;
    private Integer age;

    @JsonDeserialize(using = CustomDeserializer.class)
    private String properties;
}
public class CustomDeserializer extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return "custom-" + p.getText();
    }
}
String userStr = "{\"username\":\"job\",\"age\":18,\"properties\":\"beijing\"}";
User user = objectMapper.readValue(userStr, User.class);
// 打印结果:User(username=job, age=18, properties=custom-beijing)

最后更新于

这有帮助吗?