2017-06-01 94 views
0

我想检查我的数据是否有空值。 JSON格式的数据低于:在嵌套数据(Java)中找到空值和空字符串

"{ 

    "totalAmount" : 20000, 
    "items" : [ 
    { 
     "id" : "9fd91eaf-2b9a-4bae-9692-4222f85e868", 
     "name" : "X hotel", 
     "itemType" : 0, 
     "orderCount" : 2, 
     "amount" : 5000 
    }, 
    { 
     "id" : "9fd91eaf-2b9a-4bae-9692-4222f85e869", 
     "name": "Special Dinner", 
     "itemType" : 1, 
     "orderCount" : 1, 
     "amount" : 10000 
    } 
    ] 
}" 

这是我的检查逻辑。

class NullCheck { 
    public checkNull (Itinerary itinerary) 
     Object nu = null; 
    if (itinerary == null) { 
     return true; 
    } else if (itinerary.getTotalAmount() == null || itinerary.getItems() == null) { 
     return true; 
    } else if (itinerary.getItems().contains(null)) { 
     return true; 
    } else if (itinerary.getItems().stream().flatMap // 
      (item -> Arrays.stream(item.getClass().getDeclaredFields())) 
      .map(field -> { field.setAccessible(true); return field.get(nu) == null; })) { 
     return true; 
    } 
} 

然而,IlligalAccessException在field.get(NU)扔了,我想不通为什么我的代码不能很好地工作。 当我阅读java文档时,它在语法上似乎是正确的。 我可以问我的代码哪部分失败? 此外,某些json格式数据转换为String类型的对象,因此我还需要检查string是否为空string。 有没有简单的方法来做到这一点?

回答

1

我认为你的代码有2个错误。

第一:

if (itinerary.getItems().stream().flatMap // 
     (item -> Arrays.stream(item.getClass().getDeclaredFields())) 
     .map(field -> { field.setAccessible(true); return field.get(nu) == null; })) { 
    return true; 
} 

.map方法的结果是一个Stream<Boolean>,而不是一个布尔expression.So会有一个语法错误和不进行编译。

第二:

return field.get(nu) == null; 

这个代码将抛出NullPointerExceptionfiled是一个实例field.And方法getField可以抛出一些Exception,所以应尽量副渔获物就可以了。

0
Object nu = null; 

您正试图获得'nu'这是一个空对象。这就是你得到一个IlligalAccessException的原因。

1

的文档为Field.get

返回该字段表示的字段的值,则 指定的对象上。如果 它具有原始类型,则该值将自动包装在对象中。

请参阅它如何在指定的对象上表示?这是因为Field对象不再与特定对象关联。

这意味着Field.get操作需要传递的item对象,而不是目前要传递的null分配nu对象。

这看起来确实很乏味,请尝试使用像this这样的库进行JSON模式验证。

相关问题