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 等也可以。