2012-11-14 9 views
8

私はJackson 2.1.0を使用しています。与えられた:入力リストがhttp://test.com/が含まれている場合リストの@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; 
    } 
} 

、ジャクソンは生成します。

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

の代わり:

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

任意のアイデア?

更新:関連する説明はhttps://github.com/FasterXML/jackson-core/issues/41を参照してください。この場合

答えて

16

これが動作するようにした場合、あなたは以下を生成しようとして終わるだろう:

{ "http://test.com" } 

法的なJSONされていません。 @JsonUnwrappedは実際には1つのラッピングレイヤーを削除するだけです。理論的には「配列の配列」の場合には機能するようにできますが、そうではありません。 実際、この機能を追加するのは間違いだったのでしょうか?データバインディングのベストプラクティス(シンプルさ、1対1マッピング)に反して使用されることが主な理由です。

しかし、何の代わりに働くだろうことは@JsonValueです:

@JsonValue 
private final List<URI> companies; 

「ではなく、それを含むオブジェクトをシリアライズのこのプロパティの値を使用する」を意味しています。

作成者メソッドは実際にはそのままで、または@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; 
    } 
} 
:ここ

は修正されたコードです

関連する問題