我可以仅将 java.util.Optional 中的值序列化为 json 吗?

Could i serialize into a json only the value from a java.util.Optional?

我面临以下问题:我有一个 class 作为数据成员 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 库可用于 serialization/deserialization。其中之一是 excellent Jackson library,您可以在其中以细粒度的方式调整序列化。

如果您拥有 POJO 的源代码MyClass,您只需添加一些注释即可使其正常工作。

如果您假设 MyCustomObject 看起来像这样:

public class MyCustomObject {
    private final String myVal;

    public MyCustomObject(String myVal) {
        this.myVal = myVal;
    }

    public String getMyVal() {
        return myVal;
    }
}

然后,您的 MyClass 对象可以这样声明(注意 annotations @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!"))));

上面代码中的 magic 在于使用 ObjectMapper 处理数据绑定,即在 POJO 和 JSON 之间转换(反之亦然反之亦然)。


另一种方法,如果您不拥有 MyClass class 的源代码,即您无法修改它,那就是创建自定义序列化程序 as described in the Jackson docs.