Библиотека Джексона: настраиваемое отображение объекта Java в элементе JSON

1

У меня есть два класса

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.

Теги:
jackson

3 ответа

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

вы можете увидеть это для пользовательского сопоставления или, если вам нужно короткое сокращение, вы можете изменить геттер/сеттер пола, как это

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

  • 0
    Спасибо! ты привел меня в правильном направлении. Я нашел эту ссылку: baeldung.com/jackson-custom-serialization , это то, что я ищу.
  • 0
    рад знать, что это помогает вам!
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 и так хорошо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню