Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JSON响应获取空值_Java_Json_Rest_Rest Assured - Fatal编程技术网

Java 从JSON响应获取空值

Java 从JSON响应获取空值,java,json,rest,rest-assured,Java,Json,Rest,Rest Assured,我使用rest assured从API中提取了JSON响应,它看起来像这样: [ { "firstKey": ["value1", "value2"], "secondKey": 4, "thirdValue": "value3", "fourthValue":"value4" }, { "firstKey": ["value5", "value6"], "secondKey": 5, "thirdValue": "value7", "fourthValue":"value8" } ] 现在,

我使用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对象,一些键将具有空值,例如,“secondKey”在某些JSON对象中具有空值。 我需要获取JSON响应中具有空值的所有键。我该怎么做呢


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

假设您使用的是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);
}
var arr=JSON.parse(JSON_数组);//json_数组是您的json响应
var nullKeys=[];
对于(变量i=0;i
假设您使用的是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);
}
var arr=JSON.parse(JSON_数组);//json_数组是您的json响应
var nullKeys=[];
对于(变量i=0;i
使用带有组匹配器的正则表达式模式来提取具有
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

使用带有组匹配器的正则表达式模式来提取具有
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

你部分地回答了自己的问题——实际上,最有效的方法之一就是使用杰克逊图书馆。在本例中,您使用its有效地解析输入JSON字符串

下面是一个示例,说明如何输出所有键的空值,无论它们位于JSON结构中的何处:

JsonParser parser=new JsonFactory().createParser(json);
while(parser.nextToken()!=null){
if(parser.currentToken()==JsonToken.VALUE\u NULL){
System.out.println(“在key:+parser.currentName()中得到null”);
}
}
请注意,如果数组中存在
null
,则这也将输出key:null中的
get null。下面是一个更复杂的代码,它试图解决这个问题:

JsonParser parser=new JsonFactory().createParser(content);
堆栈嵌套阵列=新堆栈();
while(parser.nextToken()!=null){
//注:也可以使用开关
if(parser.currentToken()==JsonToken.START\u数组){
//注意:顶级数组在此处返回'null'
push(parser.currentName());
}
if(parser.currentToken()==JsonToken.END\u数组){
nestedArray.pop();
}
if(parser.currentToken()==JsonToken.VALUE\u NULL){
String key=parser.currentName();
if(key==null){
key=nestedArray.lastElement();
}
System.out.println(“在键/数组:“+key”中获得空值);
}
}

你部分回答了自己的问题-实际上,最有效的方法之一就是使用Jackson库。在本例中,您使用its有效地解析输入JSON字符串

下面是一个示例,说明如何输出所有键的空值,无论它们位于JSON结构中的何处:

JsonParser parser=new JsonFactory().createParser(json);
while(parser.nextToken()!=null){
if(parser.currentToken()==JsonToken.VALUE\u NULL){
System.out.println(“在key:+parser.currentName()中得到null”);
}
}
请注意,如果数组中存在
null
,则这也将输出key:null中的
get null。下面是一个更复杂的代码,它试图解决这个问题:

JsonParser parser=new JsonFactory().createParser(content);
堆栈嵌套阵列=新堆栈();
while(parser.nextToken()!=null){
//注:也可以使用开关
if(parser.currentToken()==JsonToken.START\u数组){
//注意:顶级数组在此处返回'null'
push(parser.currentName());
}
if(parser.currentToken()==JsonToken.END\u数组){
nestedArray.pop();
}
if(parser.currentToken()==JsonToken.VALUE\u NULL){
String key=parser.currentName();
if(key==null){
key=nestedArray.lastElement();
}
System.out.println(“在键/数组:“+key”中获得空值);
}
}

到目前为止你做了什么?解决这个问题的一个方法是使用谷歌的Gson库。然后你可以将Json映射到一个映射,你可以继续映射并过滤空值。但是,当我的响应将有10000个json对象时,我担心性能。如果在响应中返回每个json对象键,即使其值为null,您可以尝试使用正则表达式模式提取具有null值的键。到目前为止,您做了什么?解决这个问题的一个方法是使用谷歌的Gson库。然后你可以将Json映射到一个映射,你可以继续映射并过滤空值。但是,当我的响应将有10000个json对象时,我担心性能,因为每个json对象键在响应中返回,即使它的值为null,您可以尝试使用正则表达式模式来提取具有空值的键。这对于所有json键都非常有效,除了那些具有数组值的键(例如)。如果上面json中的firstKey在数组中具有一个空值,它会将键(parser.currentName())打印为空。有什么想法吗?是的,就像我在最后一句中写的那样,不是吗?这取决于你在这种情况下想做什么。您可以跳过此操作-不要将
null
添加到生成的k列表中