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

Car*_*lik 1 java serialization json java-8

我面临以下问题:我有一个类作为数据成员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;
  }
}
Run Code Online (Sandbox Code Playgroud)

当我把它变成一个json我得到这样的东西:

Optional[
                object
            ]
Run Code Online (Sandbox Code Playgroud)

我想摆脱json中的Optional部分.我能这样做吗?

was*_*ren 5

有多个Java库可用于序列化/反序列化.其中一个是优秀的杰克逊图书馆,您可以在这里以细粒度的方式调整序列化.

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

如果你认为MyCustomObject看起来像这样:

public class MyCustomObject {
    private final String myVal;

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

    public String getMyVal() {
        return myVal;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用以下代码序列化为JSON:

ObjectMapper mapper = new ObjectMapper();
final String json = mapper.writeValueAsString(
        new MyClass(Optional.ofNullable(new MyCustomObject("Yes, my value!"))));
Run Code Online (Sandbox Code Playgroud)

上面代码中的神奇之处在于使用ObjectMapper来处理数据绑定,即在POJO和JSON之间进行转换(反之亦然).


另一种方法,如果您不拥有MyClass该类的源代码,即您无法修改它,则可以创建一个自定义序列化程序,如Jackson文档中所述.