【问题标题】:Could i serialize into a json only the value from a java.util.Optional?我可以仅将 java.util.Optional 中的值序列化为 json 吗?
【发布时间】:2015-01-29 11:21:54
【问题描述】:

我面临以下问题:我有一个类作为数据成员 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 中去掉那个 Optional 部分。 我可以这样做吗?

【问题讨论】:

  • 你使用什么 JSON 库?
  • 请展示您的代码以从中生成 json。
  • 你为什么首先将MyCustomObject 包装成Optional?您的使用完全抵消了Optional 的意图,因为您正在引入另一个变量MyClass.object,它可以是null...
  • 如果你使用 Jackson,你可以为 Optional 添加一个自定义类型转换器,但 Holger 是对的,Optional 首先是多余的。
  • 嗯,这可能是多余的,但这是我必须处理的情况,如果你说杰克逊,那么我会看看。

标签: java json serialization java-8


【解决方案1】:

有多个 Java 库可用于序列化/反序列化。其中之一是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!"))));

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


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

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多