Jackson库:JSON元素中Java对象的自定义映射

时间:2015-03-20 09:18:04

标签: java json jackson

我有两个班级

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属性。

3 个答案:

答案 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等也很好。