Я сталкиваюсь со следующей проблемой: у меня есть класс, который имеет в качестве элементов данных java.util.Optional объектов, и мне нужно поместить преобразование в json. Код выглядит в общем виде следующим образом:
public class MyClass{
public java.util.Optional<MyCustomObject> object;
public Myclass(java.util.Optional<MyCustomObject> object){
this.object = object;
}
public java.util.Optional<MyCustomObject> getObject(){
return this.object;
}
public void setObject(java.util.Optional<MyCustomObject> object){
return this.object = object;
}
}
Когда я превращаю это в json, я получаю что-то вроде этого:
Optional[
object
]
Я хочу избавиться от этой необязательной части из json. Могу ли я это сделать?
Для сериализации/десериализации доступно несколько библиотек Java. Одна из них - отличная библиотека Джексона, где вы можете точно настроить сериализацию.
Если у вас есть исходный код POJO MyClass
вы можете просто добавить некоторые аннотации, чтобы заставить его работать правильно.
Если вы предположите, что MyCustomObject
выглядит так:
public class MyCustomObject {
private final String myVal;
public MyCustomObject(String myVal) {
this.myVal = myVal;
}
public String getMyVal() {
return myVal;
}
}
Затем ваш объект MyClass
может быть объявлен следующим образом (обратите внимание на аннотации @JsonIgnore
и @JsonProperty
):
public class MyClass {
private Optional<MyCustomObject> object;
public MyClass(Optional<MyCustomObject> object) {
this.object = object;
}
// Ignore the "normal" serialization
@JsonIgnore
public Optional<MyCustomObject> getObject() {
return this.object;
}
public void setObject(Optional<MyCustomObject> object) {
this.object = object;
}
// This handles the serialization
@JsonProperty("object")
private MyCustomObject getObjectAndYesThisIsAPrivateMethod() {
return getObject().orElse(null);
}
}
Наконец, вы можете использовать следующий код для сериализации в JSON:
ObjectMapper mapper = new ObjectMapper();
final String json = mapper.writeValueAsString(
new MyClass(Optional.ofNullable(new MyCustomObject("Yes, my value!"))));
Магия в приведенном выше коде заключается в использовании ObjectMapper, который обрабатывает привязку данных, т.е. преобразование между POJO и JSON (и наоборот).
Другой подход, если вы не являетесь владельцем исходного кода класса MyClass
т. MyClass
Вы не можете его изменить, это создать собственный сериализатор, как описано в документах Jackson.