我已经使用放心的方式从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并获取所有空值。但是,有没有考虑到性能的有效解决方案?
答案 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);
}
}