Джексон - Требуемое имущество?
Я использую метод Jackson readValue() для сопоставления объектов для чтения из файла JSON и преобразовываю его в свой Java-объект.
например.
mapperObject.readValue( node, MyTargetClass.class )
Есть ли какие-либо аннотации, которые я могу установить на MyTargetClass для принудительного применения необходимых атрибутов? Например, если у меня есть объект JSON со свойствами ABC, DEF и GHI, а мой Json следующий
{
"ABC" : "somevalue"
"DEF" : "someothervalue"
}
Я хочу, чтобы он каким-то образом потерпел неудачу и только преуспеть в readValue, если он содержит ABC, DEF и GHI.
Ответы
Ответ 1
Джексон не включает функции проверки достоверности, и это по дизайну (т.е. считается вне сферы охвата). Но обычно используется Bean Validation API.
Самое приятное в этом - развязка между обработкой формата данных и логикой проверки.
Это то, что используют такие функции, как DropWizard; и это направление JAX-RS (например, Джерси) принимает вещи для JAX-RS 2.0.
Ответ 2
Вы можете пометить свойство, как требуется, с аннотацией @JsonProperty(required = true)
, и при десериализации будет выведено исключение JsonMappingException, если свойство отсутствует или null.
Изменить: я получил нижний предел для этого без комментариев. Я хотел бы знать, почему, так как он делает именно то, что нужно.
Ответ 3
Если вы хотите убедиться, что поле json предоставлено, вы должны использовать @JsonProperty(value = "fieldName", required = true)
в качестве параметра для конструктора. Но этого недостаточно, у конструктора также должна быть аннотация @JsonCreator
.
Например, если у вас есть поле с именем " endPoint
" и вы хотите убедиться, что оно предоставлено в файле JSON, то следующий код вызовет исключение, если оно не предоставлено.
@JsonCreator
public QuerySettings(@JsonProperty(value = "endPoint", required = true) String endPoint) {
this.endPoint = endPoint;
}
Я нашел эту ссылку полезной для понимания аннотаций Джексона. Это также хорошо объясняет, почему required = true недостаточно и противоречит его названию.
Ответ 4
Может быть, библиотека Google GSON лучше удовлетворит ваши потребности. Но это имеет противоположное требование: вы должны строго определять все структуры.