19

Jackson 2.1.0 を使用しています。与えられた:

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/、Jackson は以下を生成します。

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

それ以外の:

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

何か案は?

更新:関連する議論については、https ://github.com/FasterXML/jackson-core/issues/41 を参照してください。

4

1 に答える 1

32

この場合、これが機能する場合、次のように作成しようとすることになります。

{ "http://test.com" }

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

しかし、代わりに機能するのは次の@JsonValueとおりです。

@JsonValue
private final List<URI> companies;

これは、「それを含むオブジェクトをシリアル化する代わりに、このプロパティの値を使用する」ことを意味します。

そして、 Creator メソッドは実際にはそのままで機能し、@JsonUnwrappedorのどちらも必要ありません@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;
    }
}
于 2012-11-15T00:29:05.263 に答える