Почему @JsonUnwrapped не работает для списков?
Я использую Джексон 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/
Джексон генерирует:
{"companies":["http://test.com/"]}
вместо:
["http://test.com/"]
Есть идеи?
ОБНОВЛЕНИЕ: см. https://github.com/FasterXML/jackson-core/issues/41 для соответствующего обсуждения.
1 ответ
В этом случае, если это сработало, вы бы попытались произвести следующее:
{ "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;
}
}