Подтвердить что ты не робот

Джексон - Требуемое имущество?

Я использую метод Jackson readValue() для сопоставления объектов для чтения из файла JSON и преобразовываю его в свой Java-объект.

например.

mapperObject.readValue( node, MyTargetClass.class )

Есть ли какие-либо аннотации, которые я могу установить на MyTargetClass для принудительного применения необходимых атрибутов? Например, если у меня есть объект JSON со свойствами ABC, DEF и GHI, а мой Json следующий

{
  "ABC" : "somevalue"
  "DEF" : "someothervalue" 
}

Я хочу, чтобы он каким-то образом потерпел неудачу и только преуспеть в readValue, если он содержит ABC, DEF и GHI.

4b9b3361

Ответ 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 лучше удовлетворит ваши потребности. Но это имеет противоположное требование: вы должны строго определять все структуры.