我是python的新手并试图提取出一些嵌套数据
这是两个产品的JSON。产品可以属于零个或多个类别
{
"Item":[
{
"ID":"170",
"InventoryID":"170",
"Categories":[
{
"Category":[
{
"CategoryID":"444",
"Priority":"0",
"CategoryName":"Paper Mache"
},
{
"CategoryID":"479",
"Priority":"0",
"CategoryName":"Paper Mache"
},
{
"CategoryID":"515",
"Priority":"0",
"CategoryName":"Paper Mache"
}
]
}
],
"Description":"Approximately 9cm wide x 4cm deep.",
"SKU":"111931"
},
{
"ID":"174",
"InventoryID":"174",
" Categories":[
{
"Category":{
"CategoryID":"888",
"Priority":"0",
"CategoryName":"Plaster"
}
}
],
"Description":"Plaster Mould - Australian Animals",
"SKU":"110546"
}
],
"CurrentTime":"2016-08-22 11:52:27",
"Ack":"Success"
}
我想弄清楚产品属于哪个类别。
我的提取代码如下: -
for x in products:
productsInCategory = []
for y in x['Categories']:
for z in y['Category']:
if z['CategoryID'] == categories[i]['CategoryID']:
productsInCategory.append(x)
这个问题是,在这种情况下,第二项只包含一个类别,而不是一个类别数组,所以这一行
for z in y['Category']:
遍历Category的属性而不是Category数组,因此导致我的代码失败
我该如何防范这种情况?使用列表推导语法可以更优雅地编写它吗?
答案 0 :(得分:4)
在这种情况下,这是一个非常糟糕的文件结构;你不应该处理这件事。如果项目可以包含多个值,则它应始终为列表。
尽管如此,您仍然可以通过检查它是否是列表来处理代码。
for x in products:
productsInCategory = []
for y in x['Categories']:
category = y['Category']
if isinstance(category, dict):
category = [category]
for z in category:
...
(您可能需要考虑一般使用更具描述性的变量名称; x
,y
和z
对阅读代码的人不是很有帮助。)
答案 1 :(得分:1)
我在JSON结构之前经常遇到这个问题...经常我几周前为它写了一个小型库...
尝试生成器并查看它是否解决了您的问题。你应该能够简单:
for x in products:
if product_id_searching_for in list(nkr.find_nested_key_values(x, 'CategoryID')):
productsInCategory.append(x)