解析数组中的嵌套 JSON 数据

Parsing nested JSON data in an arrary

试图解析一些嵌套的 JSON 数据时卡住了:

"products": [
  {
   "id":123,
   "title": "Product 1",
   "handle": "product-1",
   "tags":[
      "tag--1",
      "tag--2",
      "tag--3"
    ],
   "variants":[
   {
    "id": 456
    "price": "7.50"
   }
]
}

代码如下:

r = requests.get(url)
data = r.json()
products = data['products']
prod = []
def get_tags():
    for items in products:
        title = items['title']
        handle = items['handle']
        v = products['variants'] #issue
        prodId = v['product_id']

        t = items['tags']
        t_filtered = [k for k in t if '--' in k]
        d = dict(s.split('--') for s in t_filtered)

        d['title'] = title
        d['handle'] = handle

        d['productId'] = prodId #issue

        prod.append(d)

        print(prod)

我收到此错误:TypeError:列表索引必须是整数或切片,而不是 str

我知道这是因为变体是嵌套的,我没有像这样读取数组[{ },{ }],但我不确定如何绕过它。有什么提示、教程吗?

您正在使用 products['variants'],其中没有像 products 这样的键是字典列表。应该是:

v = items['variants']

另一个问题是尝试 prodId = v['product_id'] 其中 v 是一个字典列表。因此,您需要遍历 v 并访问 id 字段,因为 variants 下的字典中不存在 product_id 字段。你应该尝试:

prodId = [prod_vars['id'] for prod_vars in v]

我注意到在拆分 t_filtered 中的每个条目来构建 d 时存在另一个问题。由于 tags 具有 tag--something 格式,因此只有 last 标记将映射到行 d = dict(s.split('--') for s in t_filtered) 中。如果你正在尝试这样的事情,那没关系。但是你试图在一个键 'tag' 下列出所有标签号('--' 的右侧),那么你应该尝试:

d['tag'] = [s.split('--')[1] for s in t_filtered]

据我了解,您正在尝试为每个变体单独创建一个产品列表,其中变体具有所有有效标签。如果是这样,那么您应该遍历 prodId 列表并为每个产品构建单独的字典。您可以按如下方式执行此操作:

for id in prodId:
    d = {}
    d['tag'] = [s.split('--')[1] for s in t_filtered]
    d['title'] = title
    d['handle'] = handle
    d['productId'] = id
    prod.append(d)

您的整个程序将如下所示:

r = requests.get(url)
data = r.json()
products = data['products']
prod = []
def get_tags():
    for items in products:
        title = items['title']
        handle = items['handle']
        v = items['variants']
        prodId = [prod_vars['id'] for prod_vars in v]

        t = items['tags']
        t_filtered = [k for k in t if '--' in k]

        for id in prodId:
            d = {}
            d['tag'] = [s.split('--')[1] for s in t_filtered]
            print(d)
            d['title'] = title
            d['handle'] = handle
            d['productId'] = id
            prod.append(d)

    print(prod)
      
get_tags()

你会得到这样的输出:

[{'tag': ['1', '2', '3'], 'title': 'Product 1', 'handle': 'product-1', 'productId': 456}, {'tag': ['1', '2', '3'], 'title': 'Product 1', 'handle': 'product-1', 'productId': 457}]

如果这就是您所期望的,请告诉我。