2016-03-14 93 views
1

我使用Jackson库中的JsonNode对象来保存json响应。我可能有一个JSON像这样:Java可选空Json字段

{ 
    "a": "test", 
    "b": true 
} 

然而,在次b场可能会丢失。因此,它可以回来是这样的:

{ 
    "a": "test" 
} 

在这种情况下,我想回到Optional.isEmpty()当我试图检索它的价值。本质上,这是针对Java代码:

if(json.path("b").isMissingNode()) { 
    return Optional.empty(); 
} else { 
    return Optional.of(json.get("b").asBoolean()); 
} 

不过,我想凝结成使用.filter.ofNullable 1号线这一点,但我不完全知道如何做到这一点。我发现this post,显示了如何使用过滤器的例子,但我明白s是什么....

基本上我想找到标b领域,如果它不存在,然后空车返回。如果它在那里,则返回它的字段的布尔值。

编辑:这不是重复的,因为我没有序列化整个json到一个对象。我不需要JsonIgnore注释。我只想提取1个值。这就像上面那样。

+0

的可能的复制[如何告诉杰克逊序列化过程中忽略一个字段,如果其值为null?](http://stackoverflow.com/questions/11757487/how-to-tell-jackson-to-ignore -a-field-during-serialization-if-its-value-is-null) –

+0

这不是重复的,因为我没有序列化成一个对象。我只是提取1值 – Richard

回答

1

可以使用代码如下所示:

Optional<Boolean> b = Optional.ofNullable(json.get("b")) 
           .map(node -> node.asBoolean()); 

几个值得注意的要点:

  • 使用filter你不需要。 ofNullable将返回一个空的空值。根据Jackson documentation,如果节点值不存在,则返回null。
  • 与所提及的问题中与s有关的问题密切相关,map是仅在存在Optional(例如JSON具有b值)时才运行的函数。它需要一个lambda表达式,这相当于使用匿名类。 node是仅具有一种方法的Function接口的参数(apply)。你可以看看例子here
+0

完美,这正是我想要的。优秀的解释! – Richard