【问题标题】:JSON library returning Java8 Optionals? [duplicate]JSON 库返回 Java8 选项? [复制]
【发布时间】:2015-11-25 10:08:02
【问题描述】:

有人听说过返回值时支持 java8 Optionals 的 json 库吗?
假设我有以下 json 文档:

{
  "person" : {
    "address" : {
       "streetName" : "Moonshtrasse",
       "streetNo" : 12
     }
  }
}

还有一个空文档

{}

假设 JSONObject 中的 get 方法返回 Optionals,我想做这样的事情:

Optional<String> streetName = obj.getJSONObject("person")
    .flatMap(person -> person.getJSONObject("address"))
    .flatMap(adr -> adr.getString("streetName"));

而不是在每个 get 方法之后检查空值。

在第一种情况下,这个构造会给我一个包含街道名称的 Optional,在第二种情况下会给我一个空 Optional。

【问题讨论】:

  • 不,实际上不是
  • 另一个线程与 JSON 的序列化有关,并且公认的答案是有一个版本的 Jackson 可以满足需要......所以这个问题似乎由该线程回答。这里有关于这个主题的进一步主题:stackoverflow.com/questions/24547673/…
  • 使用Optional.ofNullable

标签: java json parsing java-8 optional


【解决方案1】:

根据 Optional::map 的文档,

If the mapping function returns a null result then this method returns an empty Optional.

因此,我们可以在通过 Optional::map 传递的 lambda 中按原样调用返回 null 的方法,而不是对所述返回 null 方法的 Optional 化结果进行平面映射,

JSONObject obj = new JSONObject(someJsonString);

Optional<String> streetName = Optional.ofNullable(obj.optJSONObject("person"))
    .map(person -> person.optJSONObject("address"))
    .map(address -> address.optString("streetName"))
;

【讨论】:

  • 是的,这样更简洁优雅
【解决方案2】:

关于@zeroflagL 的评论,如果我们有在所需元素不存在时返回空值的方法,他的方法将适用。
一个这样的库是org.json
当没有值时,有些 opt 方法会返回 null。所以我们可以使用 Optional 作为:

    JSONObject obj = new JSONObject(someJsonString);

    Optional<String> streetName = Optional.ofNullable(obj.optJSONObject("person"))
        .flatMap(person -> Optional.ofNullable(person.optJSONObject("address")))
        .flatMap(address -> Optional.ofNullable(address.optString("streetName")));

这会给我们所需的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2021-04-03
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    相关资源
    最近更新 更多