解析数组中的嵌套 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}]
如果这就是您所期望的,请告诉我。
试图解析一些嵌套的 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}]
如果这就是您所期望的,请告诉我。