2012-11-14 102 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; 
    } 
} 
相关问题