当前位置: 首页 > 知识库问答 >
问题:

检查jsonNode是否包含特定的键,然后在其存在时提取其值

薛弘济
2023-03-14

我用ObjectMapper将这个字符串覆盖到jsonNode。然后我试图在这个jsonNode中寻找一个特定的键,所以我使用了“.has”,但它不起作用!!以下是我所做的:

{ 
    "links": {
        "data": {
            "self": {
                "body": "", 
                "content_type": "",
                "href": "/api/v2/nodes",
                "method": "POST", 
                "name": "" 
            } 
        }
    },
    "results": { 
        "data": {
            "properties": { 
                "container": true,
                "container_size": 0,
                "create_date": "2020-06-22T16:19:07",
                "create_user_id": 1000,
                "description": ""
                "description_multilingual": { 
                    "en": "",
                    "fr_FR": "" 
                },
                "external_create_date": null,
                "external_identity": "",
                "external_identity_type": "",
                "external_modify_date": null,
                "external_source": "",
                "favorite": false,
                "id": 276625,
                "mime_type": null,
                "modify_date": "2020-06-22T16:19:07",
                "modify_user_id": 1000,
                "name": "mar",
                "name_multilingual": {
                    "en": "mar",
                    "fr_FR": ""
                },
                "owner": "Admin",
                "owner_group_id": 1001,
                "owner_user_id": 1000,
                "parent_id": 2000,
                "permissions_model": "advanced",
                "reserved": false,
                "reserved_date": null,
                "reserved_shared_collaboration": false,
                "reserved_user_id": 0,
                "size": 0,
                "size_formatted": "0 Eléments",
                "type": 0,
                "type_name": "Dossier",
                "versions_control_advanced": false,
                "volume_id": -2000 
            } 
        } 
    }
}

我想测试它是否有“id”键(它实际上存在于第31行),所以我使用了。has()如如何检查json密钥是否存在所述:

ObjectMapper mapper = new ObjectMapper();    
JsonNode rootNode= mapper.readTree(body);
         if(rootNode.has("id")){
            System.out.println(true);
         }
        else{
            System.out.println(false);
        }

但它总是显示“false”作为输出!!

共有2个答案

柳修为
2023-03-14

我认为您不必使用has()方法。

可以将json转换为映射,然后递归地查找节点

    ObjectMapper mapper = new ObjectMapper();
    Map<String, Object> map = mapper.readValue( body, Map.class );

    ArrayList<Object> container = new ArrayList<>();
    boolean value = find( map, "id", container );

    if( value )
    {
        System.out.println( container );
    }

递归方法应该访问所有节点,并在找到节点后立即返回

private static boolean find( Map<String, Object> map, String search, ArrayList<Object> container )
    {
        int i = 0;
        for( String s : map.keySet() )
        {
            i++;
            if( s.equals( search ) )
            {
                container.add( map.get( s ) );
                return true;
            }
            if( map.get( s ) instanceof Map )
            {
                boolean found = find( (Map<String, Object>) map.get( s ), search, container );
                if( i == map.size() || found )
                {
                    return found;
                }
            }
        }
        return false;
    }

我已经编辑了代码以获得值。希望这有帮助。我强烈建议你在向社区寻求帮助之前对自己做更多的研究。

龙飞
2023-03-14

如果您尝试查找放置在嵌套对象中的键,您可以使用findValue(String key)方法,如果给定键未找到值,则返回null:

ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode= mapper.readTree(json);

String[] keys = {
    "id", "create_date", "versions_control_advanced", "name", "nofield"
};

for (String key : keys) {
    JsonNode value = rootNode.findValue(key);
    System.out.printf("Key %s exists? %s --> value=%s%n", key, value != null,
                    value == null ? null : value.asText());

}

输出:

Key id exists? true --> value=276625
Key create_date exists? true --> value=2020-06-22T16:19:07
Key versions_control_advanced exists? true --> value=false
Key name exists? true --> value=
Key nofield exists? false --> value=null
 类似资料:
  • 我在我的Java应用程序中使用Jackson JSON库及其Tree Model系统()。在这种情况下,我需要检查是否包含给定的。我正在浏览JavaDocs,并且没有看到的任何类型的方法。我最终自己写了一个包含方法: 单元测试: 我是否错过了杰克逊的一些东西,我正在复制一些我错过的图书馆方法。否则,还有比我做的更好的方法吗?

  • 问题内容: 给定Linux进程的pid,我想从C程序检查该进程是否仍在运行。 问题答案: 发出信号作为系统调用。如果调用成功,则表示存在具有此pid的进程。 如果调用失败并设置为,则不存在具有此类pid的进程。 引用POSIX标准: 如果sig为0(空信号),则执行错误检查,但实际上未发送任何信号。空信号可用于检查pid的有效性。 请注意,您在竞争条件下并不安全:目标进程可能已退出,并且与此同时已

  • 问题内容: 可以说这是我的 我需要知道该对象中是否存在“视频”,如果存在,则需要获取此键的值。我尝试了以下操作,但是我无法获得此键的价值。 问题答案: 使用下面的代码来查找密钥是否存在。方法用于查找中的键。 如果您正在使用方法获取String值,则不必担心键中是否存在键。

  • 问题内容: 我有一个Array类型的PHP变量,我想找出它是否包含特定值,并让用户知道它在那里。这是我的数组: 我想做些类似的事情: 最好的方法是什么? 问题答案: 使用功能。

  • 问题内容: 我当前正在使用以下(笨拙的)代码段来确定(非空的)Swift字典是否包含给定键,并从同一字典中获取一个(任何)值。 如何将其更优雅地放在Swift中? 问题答案: 您不需要 任何 特殊的代码即可执行此操作,因为这已是字典的功能。提取时,您 知道 字典是否包含键,因为返回的Optional不包含(并且包含值)。 因此,如果您 只想 回答字典是否包含密钥的问题,请询问: 如果您需要该值并且

  • 问题内容: 那么,如何检查字符串中是否包含特定单词? 这是我的代码: 我遇到了错误。 问题答案: 并不像他们所说的那么复杂,选中此选项您不会后悔。 您可以根据需要更改。