У меня есть два класса
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
:
{
id: 11,
name: "myname",
gender: {
id: 2,
value: "F"
}
}
Я хотел бы узнать, как настроить Jackson для получения:
{
id: 11,
name: "myname",
gender: "F"
}
Я не хочу сопоставлять весь объект Gender
но только его свойство value
.
Вы можете использовать собственный сериализатор:
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;
}
вы можете увидеть это для пользовательского сопоставления или, если вам нужно короткое сокращение, вы можете изменить геттер/сеттер пола, как это
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;
}
далее вы также можете установить условие для установки мужчины/женщины на value = M/F
Нет необходимости настраивать сериализатор/десериализатор, если вы можете изменить класс 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 и так хорошо.