Могу ли я сериализовать в JSON только значение из java.util.Optional?

1

Я сталкиваюсь со следующей проблемой: у меня есть класс, который имеет в качестве элементов данных 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. Могу ли я это сделать?

  • 1
    А какую библиотеку JSON вы используете?
  • 1
    Пожалуйста, покажите ваш код для создания JSON из этого.
Показать ещё 4 комментария
Теги:
java-8
serialization

1 ответ

5
Лучший ответ

Для сериализации/десериализации доступно несколько библиотек 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.

Ещё вопросы

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