从JSON响应中获取空值

时间:2019-12-22 09:03:28

标签: java json rest rest-assured

我已经使用放心的方式从API中提取了JSON响应,它看起来像这样:

[
{
"firstKey": ["value1", "value2"],
"secondKey": 4,
"thirdValue": "value3",
"fourthValue":"value4"
},
{
"firstKey": ["value5", "value6"],
"secondKey": 5,
"thirdValue": "value7",
"fourthValue":"value8"
}
]

现在,我的实际JSON响应将在JSON数组中包含数千个JSON对象,并且其中某些键具有null值,例如。 “ secondKey”在某些JSON对象中将具有空值。 我需要获取JSON响应中具有空值的所有键。关于如何执行此操作的任何想法?

我解决这个问题的想法是使用Jackson库反序列化JSON并获取所有空值。但是,有没有考虑到性能的有效解决方案?

3 个答案:

答案 0 :(得分:0)

假设您使用的是JavaScript,并且空值看起来像"secondKey": null;

这是一种获取这些密钥的方法:

var arr = JSON.parse(json_array); // json_array is your json response
var nullKeys = [];
for (var i = 0; i < arr.length; i++){
    var obj = arr[i];
    for (var key in obj)
        if(obj[key] == null) 
            nullKeys.push(key);
}

答案 1 :(得分:0)

使用带有组匹配器的正则表达式模式提取具有null值的密钥。

    String pattern = "\"(.*)\": null";
    String json = "[\n" +
            "{\n" +
            "\"firstKey\": [\"value1\", \"value2\"],\n" +
            "\"secondKey\": null,\n" +
            "\"thirdValue\": null,\n" +
            "\"fourthValue\":\"value4\"\n" +
            "},\n" +
            "{\n" +
            "\"firstKey\": [\"value5\", \"value6\"],\n" +
            "\"secondKey\": null,\n" +
            "\"thirdValue\": \"value7\",\n" +
            "\"fourthValue\":\"value8\"\n" +
            "}\n" +
            "]";

    Matcher matcher = Pattern.compile(pattern).matcher(json);

    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }

以下是输出

secondKey
thirdValue
secondKey

答案 2 :(得分:0)

您部分回答了自己-实际上最有效的方法之一是使用Jackson库。在这种情况下,您可以使用其Streaming API来有效地解析输入的JSON字符串。

下面是一个示例,该示例显示如何将所有键输出为空值,无论它们位于JSON结构中的什么位置:

JsonParser parser = new JsonFactory().createParser(json);

while (parser.nextToken() != null) {
    if (parser.currentToken() == JsonToken.VALUE_NULL) {
        System.out.println("Got null in key: " + parser.currentName());
    }
}

请注意,如果数组中有Got null in key: null,这还将输出null。这是一个稍微复杂的代码,试图解决这个问题:

JsonParser parser = new JsonFactory().createParser(content);

Stack<String> nestedArrays = new Stack<String>();
while (parser.nextToken() != null) {
    // note: a switch could be used as well
    if (parser.currentToken() == JsonToken.START_ARRAY) {
        // note: a top level array returns `null` here
        nestedArrays.push(parser.currentName());
    }
    if (parser.currentToken() == JsonToken.END_ARRAY) {
        nestedArrays.pop();
    }
    if (parser.currentToken() == JsonToken.VALUE_NULL) {
        String key = parser.currentName();
        if (key == null) {
            key = nestedArrays.lastElement();
        }
        System.out.println("Got null in key / array: " + key);
    }
}