29

Itemクラスがあります。itemTypeそのクラス内に ItemType 型のフィールドがあります。

ざっくり、こんな感じ。

class Item
{
   int id;
   ItemType itemType;
}

class ItemType
{
   String name;
   int somethingElse;
}

ItemJackson を使用して型のオブジェクトをシリアル化すると、オブジェクトがサブObjectMapperオブジェクトとしてシリアル化されます。ItemTypeこれは期待されていますが、私が望むものではありません。

{
  "id": 4,  
  "itemType": {
    "name": "Coupon",
    "somethingElse": 1
  }
}

私がやりたいのは、シリアル化されたときに代わりにitemType'snameフィールドを表示することです。

以下のようなもの。

{
  "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

カスタム serializerを作成して使用する必要があります。

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 は 1 つのフィールドのみをシリアル化したいので、@JsonIdentityInfoおよび@JsonIdentityReferenceアノテーションを使用することもできます。

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

詳細については、「ジャクソンで子の ID のみをシリアル化する方法」を参照してください。

于 2016-11-16T11:22:09.933 に答える
1

Itemおそらく、簡単な回避策は、 getterを returnに追加し、getter を?ItemType.nameでマークすることです。ItemType@JsonIgnore

于 2012-06-14T10:35:23.030 に答える