2013-05-15 13 views
32

że mam następujące klasy:Co to jest deserializacja Jackson odpowiednik @ JsonUnwrapped?

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

produkujących JSON:

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

Jak deserializować to z powrotem do klasy nadrzędnej? Mógłbym użyć @JsonCreator

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

Ale to również skutecznie dodaje @JsonIgnoreProperties(ignoreUnknown=true) do klasy dominującej, jak wszystkie właściwości map tutaj. Jeśli więc chcesz, aby nieznane pola JSON rzuciły wyjątek, musisz to zrobić samodzielnie. Ponadto, jeśli wartości map mogłyby być inne niż ciągi znaków, konieczne byłoby ręczne sprawdzenie i konwersja typów. Czy istnieje sposób, aby Jackson poradził sobie z tą sprawą automatycznie?

Edit: mogę być szalony, ale to rzeczywiście wydaje się działać pomimo nigdy nie są wyraźnie wymienione w dokumentacji: http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
Byłem pewien, że nie działa na mnie wcześniej. Mimo to proponowane podejście @JsonCreator może być preferowane, gdy niestandardowa logika jest wymagana do deserializacji nieopakowanych typów polimorficznych.

+2

Czy jesteś pewien, że '@ JsonUnwrapped' działa w celu deserializacji? Właśnie wypróbowałem to i dostaję "Nie mogłem odczytać błędów JSON: Nierozpoznane pole ..." kiedy próbuję deserializować spłaszczony JSON. –

Odpowiedz

26

Można użyć @JsonCreator z @JsonProperty dla każdego pola:

@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 ma typ sprawdzania i nieznane pole sprawdzenia na Ciebie w tej sprawie.

+1

Dobra uwaga. To odpowiada na pytanie, jak zachować kontrolę typu/pola jackson w JsonCreators w ogóle, co może być jedynym użytecznym pytaniem, które pozostało. =) – Shaun

Powiązane problemy