2013-05-15 7 views
32

Скажем, у меня есть следующий класс:Что такое десериализация Джексона, эквивалентная @JsonUnwrapped?

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

, производящего JSON:

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

Как десериализации это обратно в родительский класс? Я мог бы использовать @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 может быть предпочтительным, когда пользовательская логика требуется для десериализации разворачиваемых полиморфных типов.

+2

Вы уверены, что '@ JsonUnwrapped' работает для десериализации? Я просто попробовал, и я получаю ошибки 'Could not read JSON: Unrecognized field ... ', когда я пытаюсь десериализировать сплющенный JSON. –

ответ

26

Вы можете использовать @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); 
} 

Джексон делает тип проверки и проверки неизвестного поля для вас в этом случае.

+1

Хорошая точка. Это отвечает на вопрос о том, как сохранить проверку типа/поля джексона в JsonCreators в целом, что может быть единственным полезным вопросом. знак равно – Shaun

Смежные вопросы