29

我有一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"
}

反正有没有指示杰克逊这样做?

4

5 回答 5

33

签出@JsonValue注释。

编辑:像这样:

class ItemType
{
  @JsonValue
  public String name;

  public int somethingElse;
}
于 2012-06-14T18:12:30.617 回答
21

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

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;
}
于 2012-06-14T10:35:15.357 回答
4

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

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

有关详细信息,请参阅如何使用 Jackson 仅序列化孩子的 ID

于 2016-11-16T11:22:09.933 回答
2

要返回简单的字符串,您可以使用默认的 ToStringSerializer 而不定义任何额外的类。但是你必须定义 toString() 方法只返回这个值。

@JsonSerialize(using = ToStringSerializer.class)
class ItemType
{
   String name;
   int somethingElse;
   public String toString(){ return this.name;}
}
于 2018-06-25T19:43:34.507 回答
1

Item也许一个快速的解决方法是在return上添加一个额外的 getter ItemType.name,并将 getter 标记ItemType@JsonIgnore?

于 2012-06-14T10:35:23.030 回答