接口返回的数据太复杂,一招教你搞定

1,011 阅读1分钟

本文首发于微信公众号【面向数据编程】

我们工作中经常会跟各种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']

如果喜欢本文,不妨点个赞让更多人看到吧!