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

Что эквивалент десериализации Джексона @JsonUnwrapped?

Скажем, у меня есть следующий класс:

public class Parent {
  public int age;
  @JsonUnwrapped
  public Name name;
}

Создание JSON:

{
  "age" : 18,
  "first" : "Joey",
  "last" : "Sixpack"
}

Как мне отделить эти слова от класса Parent? Я мог бы использовать @JsonCreator

@JsonCreator
public Parent(Map<String,String> jsonMap) {
  age = jsonMap.get("age");
  name = new Name(jsonMap.get("first"), jsonMap.get("last"));
}

Но это также эффективно добавляет @JsonIgnoreProperties(ignoreUnknown=true) в класс Parent, так как все свойства отображаются здесь. Поэтому, если вы хотите, чтобы неизвестные поля JSON генерировали исключение, вы должны сделать это сами. Кроме того, если значения карты могут быть чем-то иным, чем Strings, вам придется выполнить ручную проверку и преобразование типов. Есть ли способ для Джексона автоматически обрабатывать этот случай?

Edit: Я мог бы быть сумасшедшим, но на самом деле это работает, несмотря на то, что он никогда не упоминается в документации: http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
Я был уверен, что раньше это не сработало. Тем не менее, предложенный подход @JsonCreator может быть предпочтительным, когда пользовательская логика требуется для десериализации разворачиваемых полиморфных типов.

4b9b3361

Ответ 1

Вы можете использовать @JsonCreator с @JsonProperty для каждого поля:

@JsonCreator
public Parent(@JsonProperty("age") Integer age, @JsonProperty("firstName") String firstName,
        @JsonProperty("lastName") String lastName) {
    this.age = age;
    this.name = new Name(firstName, lastName);
}

В этом случае Jackson проверит проверку и неизвестное поле.

Ответ 3

Для тех, кто googled здесь, как я, пытаясь решить проблему, когда десериализует unrapepd Map, есть решение с @JsonAnySetter:

public class CountryList
{

    Map<String, Country> countries = new HashMap<>();

    @JsonAnySetter
    public void setCountry(String key, Country value)
    {
        countries.put(key, value);
    }

}