JSON库返回Java8 Optionals?

时间:2015-11-25 10:08:03

标签: java json parsing java-8 optional

在返回值时,是否有人听说过支持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方法之后检查空值。

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

2 个答案:

答案 0 :(得分:2)

根据Optional :: map的文档,

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

因此,我们可以在通过Optional :: map传递的lambdas中调用返回null的方法,而不是flatMapping所述返回null的方法的可选结果,

JSONObject obj = new JSONObject(someJsonString);

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

答案 1 :(得分:1)

关于来自@zeroflagL的评论,如果我们的方法在所需元素不存在时返回空值,则他的方法将适用。
一个这样的图书馆是org.json
有些方法在没有值时会返回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")));

这会给我们所需的结果。