Как поручить Джексону сериализовать поле внутри объекта вместо Object it self? - программирование
Подтвердить что ты не робот

Как поручить Джексону сериализовать поле внутри объекта вместо 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"
}

Есть ли способ дать указание Джексону сделать это?

4b9b3361

Ответ 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?