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

Java 检查jsonNode是否包含特定键,然后在其存在时提取其值,java,json,jsonnode,Java,Json,Jsonnode,我使用ObjectMapper将这个字符串覆盖到jsonNode。然后我尝试在这个jsonNode中寻找一个特定的键,所以我使用了.has,但它没有起作用!! 以下是我所做的: { "links": { "data": { "self": { "body": "", "co

我使用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,如中所述:


但它总是将false显示为输出

如果您试图查找放置在嵌套对象中的键,可以使用 findValueString键方法,如果给定键未找到值,则返回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

如果您试图查找放置在嵌套对象内的键,可以使用 findValueString键方法,如果给定键未找到值,则返回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

我想你不一定要用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;
    }
我已经编辑了代码以获得值。
希望这有帮助。我强烈建议你在向社区寻求帮助之前,对自己进行更多的研究。

我认为你不一定要使用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;
    }
我已经编辑了代码以获得值。
希望这有帮助。我强烈建议你在向社区寻求帮助之前对自己进行更多的研究。

这是否回答了你的问题?根节点只有链接和结果,不查找嵌套结构。@Frighi不,我试过了,但不起作用too@BenjaminEckardt是的!因为当我测试链接和结果时,它是有效的!!有什么解决办法吗???@MAryem你试过什么?这是完全相同的事情,它必须工作!这回答了你的问题吗?根节点只有链接和结果,不查找嵌套结构。@Frighi不,我试过了,但不起作用too@BenjaminEckardt是的!因为当我测试链接和结果时,它是有效的!!有什么解决办法吗???@MAryem你试过什么?这是完全相同的事情,它必须工作!是的,这是有效的,但我想提取它的值,如果它存在,findValue更适合提供更新中所示的特定单叶值。是的,这是有效的,但我想提取它的值,如果它存在,findValue更适合提供更新中所示的特定单叶值。它可以工作,但一旦找到该键,我需要提取该键的值。我添加了该部分以获取该值。ArrayList用作容器。它可以工作,但一旦找到它,我需要提取该键的值。我添加了部分以获取值。用作容器的ArrayList。