Json中key的搜索

本文介绍了一个用于在JSON对象或全局作用域中搜索特定键名的实用函数。该函数能够递归地查找匹配的键名,并返回所有匹配项的路径列表。通过示例展示了如何使用此函数来定位复杂JSON结构中的指定数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//在json或全局中搜索某个key的位置(要搜索的key关键字,要搜索的json,不传则为window全局,第三第四个递归用一般不传)
var JsonSearch= function (str, SearhJson, Defaultpath, JsonList) {
        var rearr = new Array();
        if (!SearhJson) SearhJson = window
        if (!Defaultpath) Defaultpath = "$";
        if (!JsonList) JsonList = new Array();
        JsonList.push(SearhJson);
        for (var key in SearhJson) {
            var keyName = Defaultpath + "." + key;
            if (key.indexOf(str) > -1) rearr.push(keyName)
            var knarr = keyName.split(".")
            //防子指针指向母
            if (JsonList.find(p=> p == SearhJson[key]) != null) continue
            //递归
            var jtype = (Object.prototype.toString.call(SearhJson[key])).toLowerCase().split(" ")[1].replace("]", "")
            if (jtype == "object" || jtype == "array") {
                JsonSearch(str, SearhJson[key], keyName, JsonList.map(p=>p)).forEach(p=> {
                    rearr.push(p)
                });
            }
        }
        return rearr;
    }
  var ks = {
            ak: {
                kj: {
                    cad:55
                }
            }
            
        }
        ks.ss = ks.ak.kj;
         console.log(JsonEditor.JsonSearch("cad",ks))//返回["$.ak.kj.cad", "$.ss.cad"]


<think>我们根据用户需求:提取JSON数据中的所有key值,参考了多个引用中的代码示例。引用[1]提供了Python递归遍历字典获取所有key的方法,引用[2]和[4]也涉及了Python处理JSON的类似方法,引用[3]则使用Java和JsonNode来提取嵌套数据,但用户要求的是提取所有key,所以我们重点参考引用[1]的递归方法。我们将提供两种语言(Python和Java)的示例代码:1.Python:使用递归函数遍历字典(由JSON解析得到)的所有键,包括嵌套的键。2.Java:使用Jackson库的JsonNode递归遍历所有字段名。注意:由于用户问题中提到的引用[3]使用了Jackson库,所以我们Java示例将使用Jackson。另外,用户问题中引用的代码有些是不完整的(如引用[2]中出现了无关的中文句子),我们将以引用[1]的Python代码为基础,并参考引用[4]中处理嵌套结构的方法。步骤:1.解析JSON字符串为数据结构(Python中是dict,Java中是JsonNode或Object)2.递归遍历该数据结构,收集所有键(key)。我们分别给出两种语言的示例代码。</think> ### 从 JSON 数据中提取所有 key 值的方法 根据您提供的引用信息和需求,以下是提取 JSON 所有 key 值的完整解决方案: #### Python 递归遍历方法(推荐) ```python import json def extract_keys(data): """ 递归提取 JSON 中所有嵌套的 key :param data: JSON 对象(字典或列表) :return: 所有 key 的列表 """ keys = [] if isinstance(data, dict): for key, value in data.items(): keys.append(key) # 添加当前 key keys.extend(extract_keys(value)) # 递归处理值 elif isinstance(data, list): for item in data: keys.extend(extract_keys(item)) # 递归处理列表元素 return keys # 示例使用 json_str = '{"type": "object", "properties": {"category": {"description": "123"}}}' data = json.loads(json_str) all_keys = extract_keys(data) print("提取的 keys:", all_keys) # 输出: ['type', 'properties', 'category', 'description'] ``` #### Java 实现方案(使用 Jackson 库) ```java import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class JsonKeyExtractor { public static List<String> extractKeys(JsonNode node) { List<String> keys = new ArrayList<>(); if (node.isObject()) { Iterator<String> fieldNames = node.fieldNames(); while (fieldNames.hasNext()) { String key = fieldNames.next(); keys.add(key); keys.addAll(extractKeys(node.get(key))); // 递归处理嵌套值 } } else if (node.isArray()) { for (JsonNode element : node) { keys.addAll(extractKeys(element)); // 处理数组元素 } } return keys; } public static void main(String[] args) throws Exception { String json = "{\"version\":\"1.4.2\",\"metadata\":{\"author\":\"johanna\"}}"; JsonNode root = new ObjectMapper().readTree(json); System.out.println("提取的 keys: " + extractKeys(root)); // 输出: [version, metadata, author] } } ``` ### 关键技术说明 1. **递归原理**: - 遍历所有字典对象(Python 的 `dict` / Java 的 `JsonNode`) - 对每个值递归调用提取函数 - 处理列表/数组元素时进行递归遍历 2. **数据类型处理**: - ✅ 对象类型(`dict`/`JsonNode`):提取当前字段名 - ✅ 数组类型(`list`/`ArrayNode`):遍历每个元素 - ⚠️ 基本类型(字符串/数值):不包含 key 3. **适用场景**: - JSON 结构分析工具开发 - API 响应数据校验 - 动态生成文档目录 - 深度数据搜索功能 > 参考引用:Python 递归遍历 JSON 键值的实现参考了引用[1]的核心思路并完善了数组处理能力;Java 方案基于 Jackson 库的特性开发,参考了引用[3]中 JsonNode 的遍历方法[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值