2012-11-14 20 views
8

Używam Jackson 2.1.0. Biorąc pod uwagę:Dlaczego funkcja @JsonUnwrapped nie działa dla list?

public static final class GetCompanies 
{ 
    private final List<URI> companies; 

    /** 
    * Creates a new GetCompanies. 
    * <p/> 
    * @param companies the list of available companies 
    * @throws NullPointerException if companies is null 
    */ 
    @JsonCreator 
    public GetCompanies(@JsonUnwrapped @NotNull List<URI> companies) 
    { 
     Preconditions.checkNotNull(companies, "companies"); 

     this.companies = ImmutableList.copyOf(companies); 
    } 

    /** 
    * @return the list of available companies 
    */ 
    @JsonUnwrapped 
    @SuppressWarnings("ReturnOfCollectionOrArrayField") 
    public List<URI> getCompanies() 
    { 
     return companies; 
    } 
} 

Gdy lista wejściowy zawiera http://test.com/ Jackson generuje:

{"companies":["http://test.com/"]} 

zamiast:

["http://test.com/"] 

jakieś pomysły?

UPDATE: Zobacz https://github.com/FasterXML/jackson-core/issues/41, aby zapoznać się z podobną dyskusją.

Odpowiedz

16

W tym przypadku, jeśli to była praca, którą w końcu próbuje produkować następujące:

{ "http://test.com" } 

JSON, który nie jest legalne. @JsonUnwrapped tak naprawdę usuwa jedną warstwę zawijania. I chociaż teoretycznie można go zastosować do pracy w przypadku "tablic w tablicach", nie ma takiej możliwości. Zastanawiam się również, czy dodanie tej funkcji było błędem: głównie dlatego, że zachęca do częstego używania najlepszych praktyk (prostota, mapowanie jeden do jednego).

Ale co będzie działać zamiast jest @JsonValue:

@JsonValue 
private final List<URI> companies; 

co oznacza „wartości użytkowej tej nieruchomości zamiast szeregowania obiektu, który zawiera go”.

Metoda twórcy działa tak jak jest, nie trzeba ani @JsonUnwrapped ani @JsonProperty.

Oto poprawiony kod:

public static final class GetCompanies 
{ 
    private final List<URI> companies; 

    /** 
    * Creates a new GetCompanies. 
    * <p/> 
    * @param companies the list of available companies 
    * @throws NullPointerException if companies is null 
    */ 
    @JsonCreator 
    public GetCompanies(@NotNull List<URI> companies) 
    { 
     Preconditions.checkNotNull(companies, "companies"); 

     this.companies = ImmutableList.copyOf(companies); 
    } 

    /** 
    * @return the list of available companies 
    */ 
    @JsonValue 
    @SuppressWarnings("ReturnOfCollectionOrArrayField") 
    public List<URI> getCompanies() 
    { 
     return companies; 
    } 
} 
Powiązane problemy