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

时间:2012-06-14 10:22:19

标签: java serialization jackson

我有一个Item课程。该类中有一个itemType字段,其类型为ItemType。

粗略地说,就像这样。

class Item
{
   int id;
   ItemType itemType;
}

class ItemType
{
   String name;
   int somethingElse;
}

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

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

我想要做的是在序列化时显示itemType的{​​{1}}字段。

如下所示。

name

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

5 个答案:

答案 0 :(得分:19)

查看@JsonValue注释。

编辑:像这样:

class ItemType
{
  @JsonValue
  public String name;

  public int somethingElse;
}

答案 1 :(得分:16)

您需要创建并使用custom 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;
}

答案 2 :(得分:2)

由于OP只想序列化一个字段,您还可以使用@Override protected void onStart() { GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); mGoogleApiClient.connect(); super.onStart(); } signout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { // ... Toast.makeText(getApplicationContext(),"Logged Out",Toast.LENGTH_SHORT).show(); Intent i=new Intent(getApplicationContext(),MainActivity.class); startActivity(i); } }); } @JsonIdentityInfo注释:

@JsonIdentityReference

有关详细信息,请参阅How to serialize only the ID of a child with Jackson

答案 3 :(得分:1)

或许快速解决方法是在Item上添加额外的getter以返回ItemType.name,并使用ItemType标记@JsonIgnore getter?

答案 4 :(得分:0)

To return simple string, you can use default ToStringSerializer without define any extra classes. But you have to define toString() method return this value only.

@JsonSerialize(using = ToStringSerializer.class)
class ItemType
{
   String name;
   int somethingElse;
   public String toString(){ return this.name;}
}