Я пытаюсь использовать библиотеку Джексона для десериализации, так как у меня есть сценарий, в котором я должен проверить значения null
во многих JsonProperty, если он установлен как required=true
.
Вот фрагмент кода.
public class JacksonValidator {
private static final ObjectMapper MAPPER = new ObjectMapper();
public static void main(String[] args) {
// Should succeed since all properties have value and required=true holds good
validate("{\"id\": \"1\",\"age\": 26,\"name\": \"name1\"}");
// Should throw exception since name is null (because of required=true)
validate("{\"id\": \"2\",\"age\": 28,\"name\": null}");
// Should throw exception since id is null (because of required=true)
validate("{\"id\": null,\"age\": 27,\"name\": \"name2\"}");
}
public static void validate(String json) {
try {
Customer customer = MAPPER.readValue(json, Customer.class);
System.out.println(customer);
}
catch (IOException e) {
throw new DeserializationException(String.format("Validation failed. Unable to parse json %s", json), e);
}
}
@Setter
@Getter
@ToString
public static class Customer {
private String id;
private Integer age;
private String name;
@JsonCreator
public Customer(@JsonProperty(value = "id", required = true) String id,
@JsonProperty(value = "age", required = false) Integer age,
@JsonProperty(value = "name", required = true) String name) {
this.id = id;
this.age = age;
this.name = name;
}
}
}
Как вы можете видеть в приведенном выше коде, я пытаюсь десериализовать JSON
в Customer
класс.Если свойство required
установлено в true
для JsonProperty
и при десериализации, если это свойство встречает null
(для полей id
и name
в приведенном выше коде), я должен выбросить пользовательский DeserializationException
.
А также мне нужно обработать значения null
(не должно заканчиваться ошибкой) для полей, где в JsonProperty установлено значение required=false
(для поля age
).
Здесь я не могу использовать MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL)
, так как мне нужно обработать null
значения для required=false
полей.
Пожалуйста, дайте мне знать, как этого можно достичь, используя метод ObjectMapper.readValue
или любой другой метод, который здесь работает..
Будем благодарны за любые предложения.