2012-11-14 136 views
8

我正在使用Jackson 2.1.0。鑑於:爲什麼@JsonUnwrapped不能用於列表?

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; 
    } 
} 

當輸入列表包含http://test.com/,傑克遜生成:

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

代替:

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

任何想法?

UPDATE:有關相關討論,請參閱https://github.com/FasterXML/jackson-core/issues/41

回答

16

在這種情況下,如果這是工作,你最終想生產以下:

{ "http://test.com" } 

這是不合法的JSON。 @JsonUnwrapped真的只是刪除了一層包裝。雖然理論上它可以用於「數組中的數組」的情況,但事實並非如此。 事實上,我想知道是否添加這個功能是一個錯誤:主要是因爲它鼓勵使用通常是針對數據綁定最佳實踐(簡單,一對一的映射)。

但什麼工作,而不是爲@JsonValue

@JsonValue 
private final List<URI> companies; 

這意味着「該物業的使用價值,而不是序列化包含它的對象」。

創建者方法實際上可以按原樣工作,不需要@JsonUnwrapped@JsonProperty

這裏是校正後的代碼:

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; 
    } 
} 
相關問題