本文首发于微信公众号【面向数据编程】
我们工作中经常会跟各种API返回的JSON数据打交道,嵌套JSON是很常见的情况,往往这种情况也比较难处理。如果说我们希望从嵌套的JSON数据中返回某个key的所有值,需要遍历很多次进行查询。
当然,JSON本质上就是树结构,因此使用递归是更好的方式,我们可以定义如下方法:
def extract_values(obj, alist, key):
if isinstance(obj, dict):
for k, v in obj.items():
if isinstance(v, (dict, list)):
extract_values(v, alist, key)
elif k == key:
alist.append(v)
elif isinstance(obj, list):
for item in obj:
extract_values(item, alist, key)
方法接收的参数分别为传入的JSON数据,存储查询值的列表,需要被查询的key。
具体使用方法如下:
假设我们有这么一段返回的JSON数据,
{
"index_list": [
"1",
"2",
"3",
"4",
"5",
"6"
],
"user_id_list": [
"100"
],
"rows": [
{
"elements": [
{
"text":"I love you",
"note":"From 1",
"mail_status":{
"code": "200",
"form":"Origin"
}
},
{
"text":"I miss you",
"note":"From 2",
"mail_status":{
"code": "200",
"form":"FW"
}
},
{
"text":"I hate you",
"note":"From 3",
"mail_status":{
"code": "200",
"form":"FW"
}
},
{
"text":"I want you",
"note":"From 4",
"mail_status":{
"code": "200",
"form":"FW"
}
}
]
}
],
"status": "OK"
}
现在需要找到所有的text字段的文本,
arr = []
extract_value(ajson, arr, "text")
则arr列表会返回:
['I love you', 'I miss you', 'I hate you', 'I want you']
如果喜欢本文,不妨点个赞让更多人看到吧!