Как поручить Джексону сериализовать поле внутри объекта вместо Object it self?
У меня есть класс Item
. Внутри этого класса есть поле itemType
, которое имеет тип ItemType.
грубо говоря, что-то вроде этого.
class Item
{
int id;
ItemType itemType;
}
class ItemType
{
String name;
int somethingElse;
}
Когда я сериализую объект типа Item
с помощью Jackson ObjectMapper
, он сериализует объект itemType
как под-объект. Что ожидается, но не то, что я хочу.
{
"id": 4,
"itemType": {
"name": "Coupon",
"somethingElse": 1
}
}
Что я хотел бы сделать, это показать поле itemType
name
вместо сериализации.
Что-то вроде ниже.
{
"id": 4,
"itemType": "Coupon"
}
Есть ли способ дать указание Джексону сделать это?
Ответы
Ответ 1
Вам нужно создать и использовать настраиваемый сериализатор.
public class ItemTypeSerializer extends JsonSerializer<ItemType>
{
@Override
public void serialize(ItemType value, JsonGenerator jgen,
SerializerProvider provider)
throws IOException, JsonProcessingException
{
jgen.writeString(value.name);
}
}
@JsonSerialize(using = ItemTypeSerializer.class)
class ItemType
{
String name;
int somethingElse;
}
Ответ 2
Отметьте @JsonValue
аннотацию.
EDIT: например:
class ItemType
{
@JsonValue
public String name;
public int somethingElse;
}
Ответ 3
Поскольку OP только хочет сериализовать одно поле, вы также можете использовать аннотации @JsonIdentityInfo
и @JsonIdentityReference
:
class Item {
int id;
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="name")
@JsonIdentityReference(alwaysAsId=true)
ItemType itemType;
}
Для получения дополнительной информации см. Как сериализовать только идентификатор ребенка с Джексоном.
Ответ 4
Возможно, быстрое обходное решение состоит в том, чтобы добавить дополнительный getter на Item
, чтобы вернуть ItemType.name
, и пометить ItemType
getter с помощью @JsonIgnore
?