我有两个班级
public class Person {
private long id;
private String name;
private Gender gender;
// getter and setter omitted
}
和
public class Gender {
private long id;
private String value;
// getter and setter omitted
}
默认情况下,与Person
对象的Jackson库的JSON映射是:
{
id: 11,
name: "myname",
gender: {
id: 2,
value: "F"
}
}
我想知道如何配置Jackson获取:
{
id: 11,
name: "myname",
gender: "F"
}
我不希望映射所有Gender
对象,只映射其value
属性。
答案 0 :(得分:4)
您可以使用自定义序列化程序:
public class GenderSerializer extends JsonSerializer<Gender> {
public GenderSerializer() {
}
@Override
public void serialize(Gender gender, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeString(gender.getValue());
}
}
在你的Person类中:
public class Person {
private long id;
private String name;
@JsonSerialize(using = GenderSerializer.class)
private Gender gender;
}
答案 1 :(得分:1)
您可能希望this看到自定义映射,或者如果您需要快捷方式,那么您可以更改此类性别的getter / setter
public String getGender(String type){
this.getGender().getValue();
}
public void setGender(String value){
Gender gender = new Gender();
gender.setId(2);
gender.setValue(value);
this.gender = gender;
}
此外,您还可以设置条件设置男性/女性值= M / F
答案 2 :(得分:0)
如果您可以修改Gender
类,则无需自定义序列化器/反序列化器。对于序列化,您可以使用@JsonValue
,用于反序列化简单构造函数(可选择使用@JsonCreator
注释):
public class Gender {
@JsonCreator // optional
public Gender(String desc) {
// handle detection of "M" or "F"
}
@JsonValue
public String asString() { // name doesn't matter
if (...) return "M";
return "F";
}
}
或者你可以使用静态工厂方法而不是构造函数;如果是,则必须使用@JsonCreator
进行注释。
并且用@JsonValue
注释的返回类型的方法可以是杰克逊知道如何序列化的任何东西;这里我们使用String,但是Enum
,POJO等也很好。