在实际业务开发中,我们经常会遇到结构复杂的嵌套JSON数据,其中不同层级的节点都可能包含label和value属性,需要把这些属性对全部提取出来组成扁平数组,方便后续的数据展示或者逻辑处理。

核心实现思路
要实现递归提取所有label/value对,核心逻辑可以分为三个步骤:
- 遍历当前JSON对象的每一个属性
- 判断当前属性值是否为对象或者数组,如果是则继续递归处理
- 如果当前节点同时包含label和value属性,就把这对值存入结果数组
JavaScript实现示例
以下是使用JavaScript实现的完整代码,支持处理对象和数组两种嵌套结构:
// 定义待处理的嵌套JSON数据
const nestedJson = {
label: "一级分类",
value: "category1",
children: [
{
label: "二级分类A",
value: "subCategoryA",
children: {
label: "三级分类A1",
value: "subCategoryA1"
}
},
{
label: "二级分类B",
value: "subCategoryB"
}
]
};
// 递归提取label/value对的函数
function extractLabelValuePairs(data, result = []) {
// 如果当前数据是数组,遍历每个元素递归处理
if (Array.isArray(data)) {
data.forEach(item => extractLabelValuePairs(item, result));
return result;
}
// 如果当前数据是对象
if (typeof data === "object" && data !== null) {
// 判断当前对象是否同时包含label和value属性
if ("label" in data && "value" in data) {
result.push({
label: data.label,
value: data.value
});
}
// 遍历对象的所有属性,继续递归处理
Object.values(data).forEach(value => {
if (typeof value === "object" && value !== null) {
extractLabelValuePairs(value, result);
}
});
}
return result;
}
// 执行提取并打印结果
const flatArray = extractLabelValuePairs(nestedJson);
console.log(flatArray);
Python实现示例
同样的逻辑也可以用Python实现,适配Python的数据结构特点:
# 定义待处理的嵌套JSON数据
nested_json = {
"label": "一级分类",
"value": "category1",
"children": [
{
"label": "二级分类A",
"value": "subCategoryA",
"children": {
"label": "三级分类A1",
"value": "subCategoryA1"
}
},
{
"label": "二级分类B",
"value": "subCategoryB"
}
]
}
# 递归提取label/value对的函数
def extract_label_value_pairs(data, result=None):
if result is None:
result = []
# 如果当前数据是列表,遍历每个元素递归处理
if isinstance(data, list):
for item in data:
extract_label_value_pairs(item, result)
return result
# 如果当前数据是字典
if isinstance(data, dict):
# 判断当前字典是否同时包含label和value键
if "label" in data and "value" in data:
result.append({
"label": data["label"],
"value": data["value"]
})
# 遍历字典的所有值,继续递归处理
for value in data.values():
if isinstance(value, (dict, list)):
extract_label_value_pairs(value, result)
return result
# 执行提取并打印结果
flat_array = extract_label_value_pairs(nested_json)
print(flat_array)
注意事项
在实际使用中还需要注意几个特殊场景:
- 如果JSON中存在循环引用,递归会导致栈溢出,需要先处理循环引用问题
- 如果label或者value的值本身也是对象,需要根据业务需求决定是否继续提取,上述示例中默认只提取基本类型的label和value
- 如果嵌套层级非常深,可能需要考虑改用迭代方式实现,避免递归栈溢出
总结
递归提取嵌套JSON中的label/value对核心是遍历所有节点,判断目标属性是否存在,把符合条件的属性对存入结果数组。上述两种语言的实现都遵循这个逻辑,大家可以根据自己使用的技术栈选择对应的实现方式,也可以根据业务需求调整判断条件,适配更多复杂的数据结构。
JSON递归label_value提取扁平数组修改时间:2026-07-20 20:00:23