如何指示杰克逊序列化对象内部的字段而不是自己的对象?

Ran*_*ray 23 java serialization jackson

Item上课了.itemType该类中有一个类型为ItemType 的字段.

粗略地,这样的事情.

class Item
{
   int id;
   ItemType itemType;
}

class ItemType
{
   String name;
   int somethingElse;
}
Run Code Online (Sandbox Code Playgroud)

当我Item使用Jackson ObjectMapper序列化类型的对象时,它将对象序列化为ItemType子对象.这是预期的,但不是我想要的.

{
  "id": 4,  
  "itemType": {
    "name": "Coupon",
    "somethingElse": 1
  }
}
Run Code Online (Sandbox Code Playgroud)

我想这样做是显示itemTypename序列化时,现场来代替.

像下面的东西.

{
  "id": 4,  
  "itemType": "Coupon"
}
Run Code Online (Sandbox Code Playgroud)

无论如何都要指示杰克逊这样做吗?

Sta*_*Man 23

查看@JsonValue注释.

编辑:像这样:

class ItemType
{
  @JsonValue
  public String name;

  public int somethingElse;
}
Run Code Online (Sandbox Code Playgroud)

  • 注意解释这将如何解决我的问题?:) (3认同)
  • 问题是"如何指示杰克逊序列化对象内部的字段而不是自己的对象?" 这是通过用`@JsonValue`注释所述字段来完成的. (2认同)

pin*_*33n 17

您需要创建和使用自定义序列化程序.

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;
}
Run Code Online (Sandbox Code Playgroud)


Jac*_*gen 5

由于OP只想序列化一个字段,因此您还可以使用@JsonIdentityInfo@JsonIdentityReference注释:

class Item {
    int id;
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="name")
    @JsonIdentityReference(alwaysAsId=true)
    ItemType itemType;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅如何仅序列化 Jackson 孩子的 ID