我有一个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
有没有指示杰克逊这样做?
答案 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;}
}