在处理JSON数据时,有时会遇到多个同名key的情况。这通常发生在嵌套的JSON结构中。获取这些同名key的值需要遍历JSON对象并提取相应的值。以下是一些常见的方法:
你可以编写一个递归函数来遍历JSON对象,并收集所有同名key的值。
import json
def get_values(obj, key):
values = []
if isinstance(obj, dict):
for k, v in obj.items():
if k == key:
values.append(v)
elif isinstance(v, (dict, list)):
values.extend(get_values(v, key))
elif isinstance(obj, list):
for item in obj:
values.extend(get_values(item, key))
return values
# 示例JSON数据
json_data = '''
{
"name": "John",
"age": 30,
"address": {
"city": "New York",
"name": "Downtown"
},
"contacts": [
{"type": "email", "value": "john@example.com"},
{"type": "phone", "value": "123-456-7890"},
{"type": "email", "value": "john.doe@example.com"}
]
}
'''
# 解析JSON数据
data = json.loads(json_data)
# 获取所有名为"name"的值
names = get_values(data, 'name')
print(names) # 输出: ['John', 'Downtown']
你也可以使用一些第三方库来简化这个过程,例如jsonpath-ng
。
import json
from jsonpath_ng import parse
# 示例JSON数据
json_data = '''
{
"name": "John",
"age": 30,
"address": {
"city": "New York",
"name": "Downtown"
},
"contacts": [
{"type": "email", "value": "john@example.com"},
{"type": "phone", "value": "123-456-7890"},
{"type": "email", "value": "john.doe@example.com"}
]
}
'''
# 解析JSON数据
data = json.loads(json_data)
# 使用jsonpath-ng获取所有名为"name"的值
jsonpath_expr = parse('**.name')
names = [match.value for match in jsonpath_expr.find(data)]
print(names) # 输出: ['John', 'Downtown']
jsonpath-ng
可以简化这一过程。通过以上方法,你可以有效地获取和处理多个同名key的JSON值。
领取专属 10元无门槛券
手把手带您无忧上云