Jackson 库:JSON 元素中 Java 对象的自定义映射
Jackson library: custom mapping of a Java object in a JSON element
我有两个class
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
}
默认情况下 JSON 与 Person
对象的 Jackson 库的映射是:
{
id: 11,
name: "myname",
gender: {
id: 2,
value: "F"
}
}
我想知道如何配置 Jackson 以获得:
{
id: 11,
name: "myname",
gender: "F"
}
我不想映射所有 Gender
对象,而只映射它的 value
属性。
您可能想查看 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;
}
此外,您还可以将设置 male/female 的条件放在 value= M/F
上
您可以使用自定义序列化程序:
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());
}
}
还有你的人 class:
public class Person {
private long id;
private String name;
@JsonSerialize(using = GenderSerializer.class)
private Gender gender;
}
如果可以修改 Gender
class,则无需自定义 serializer/deserializer。对于序列化,您可以使用 @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
注释的 return 类型的方法可以是 Jackson 知道如何序列化的任何东西;这里我们使用 String,但是 Enum
,POJO 等也可以。
我有两个class
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
}
默认情况下 JSON 与 Person
对象的 Jackson 库的映射是:
{
id: 11,
name: "myname",
gender: {
id: 2,
value: "F"
}
}
我想知道如何配置 Jackson 以获得:
{
id: 11,
name: "myname",
gender: "F"
}
我不想映射所有 Gender
对象,而只映射它的 value
属性。
您可能想查看 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;
}
此外,您还可以将设置 male/female 的条件放在 value= M/F
上您可以使用自定义序列化程序:
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());
}
}
还有你的人 class:
public class Person {
private long id;
private String name;
@JsonSerialize(using = GenderSerializer.class)
private Gender gender;
}
如果可以修改 Gender
class,则无需自定义 serializer/deserializer。对于序列化,您可以使用 @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
注释的 return 类型的方法可以是 Jackson 知道如何序列化的任何东西;这里我们使用 String,但是 Enum
,POJO 等也可以。