在嵌套数据中查找空值和空字符串(Java)

时间:2017-06-01 00:40:05

标签: java json null

我想检查我的数据是否为空值。 JSON格式的数据如下:

"{

    "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;
    }
}

然而,在field.get(nu)抛出IlligalAccessException,我无法弄清楚为什么我的代码不能正常工作。 当我阅读java文档时,它在语法上似乎是正确的。 我可以问我的代码中哪一部分失败了吗? 此外,一些json格式数据被转换为String类型的对象,因此我还需要检查string是否为空string。 有简单的方法吗?

3 个答案:

答案 0 :(得分:1)

Field.get

的文档
  

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

看看它在指定对象上的表达方式?那是因为Field对象不再与特定对象相关联。

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

这看起来非常繁琐,请尝试使用像this这样的库来进行JSON模式验证。

答案 1 :(得分: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>,而不是bool表达式。因此会出现语法错误而无法编译。

第二个:

return field.get(nu) == null;

NullPointerException是实例字段时,此代码将抛出filedget中的方法Field可能会抛出一些Exception,因此应该尝试抓住它。

答案 2 :(得分:0)

Object nu = null;

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