对于我的项目,我需要列出所有产品并将其作为我的应用程序的嵌套JSON发送。我已经创建了代码来执行此操作,但我不明白我的逻辑在哪里失败了。以下是我的代码。
我拥有的统一数据类似于type
,category
,sub
,name
,price
等等。
由于Type,Cat,Sub在一个字符串中,我用re.search
解析它们,结果存储在parse
。
在我的python main
中,我检索所有记录,并在for each row in rows
中调用:
product_list = add_on_tree(parse, product_list, p_dict, 1)
其中product_list最初为[]
,p_dict是一个字典,如:{name:'',price:'',... etc}
def add_on_tree(parse, plist, pdict, i):
if parse.group(i):
listCheck = ""
"""
empty ==>> plist is empty
match ==>> plist[i].type = parse.group(i)
nomatch ==>> plist[i].type != parse.group(i)
"""
if plist==[]:
listCheck = "empty"
else:
listCheck = "nomatch"
for l in plist:
if l["type"]==parse.group(i):
listCheck = "match"
if listCheck in ["empty", "nomatch"]:
newdict = {}
newdict["type"] = parse.group(i)
newdict["sub"] = []
newdict["leaves"] = []
try:
if parse.group(i+1):
sublist = add_on_tree(parse, [], pdict, i+1 )
newdict["sub"] = sublist
plist.append(newdict)
return plist
except:
newdict["leaves"].append(pdict)
plist.append(newdict)
return plist
else:
for p in plist:
if p["type"]==parse.group(i):
try:
if parse.group(i+1):
sublist = add_on_tree(parse, p["sub"], pdict, i+1)
p["sub"] = sublist
return plist
except:
p["leaves"].append(pdict)
return plist
else:
p["sub"] = ["Error Somewhere", p["type"]]
return plist
必需的树状结构
[
{
type : 'car entertainment',
sub : [
{
type : 'Head Unit',
sub : [
{
type : 'USB',
sub : [],
products : [
{
name : '',
url : '',
price: ''
}
]
}
],
products : []
},
{},
{}
],
products : []
},
{
type : 'home entertainment',
sub : [
{
type : 'Audio',
sub : [],
products : [
{
name:,
url:,
type:
},
{
name:,
url:,
type:
}
]
},
{},
{}
],
products : []
}
]
我得到了什么:
{
"products": [
{
"leaves": [],
"sub": [
"Error Somewhere",
"Car Entertainment"
],
"type": "Car Entertainment"
},
{
"leaves": [],
"sub": [
{
"leaves": [],
"sub": [
{
"leaves": [
{
"desc": "",
"image": "",
"name": "",
"price": 25000.0,
"url": ""
}
],
"sub": [],
"type": "Smartest"
}
],
"type": "Smart"
}
],
"type": "Home Entertainment"
}
]
}
在flask
中,我使用了jsonify(products=product_list)
,它解释了最外面的字典products
。
其他信息
mysql
数据库,它只有四条记录。pdb
时,我发现某处出现错误'附加,打印p ["类型"]返回p ['类型'] 如果我改变
product_list = add_on_tree(parse, product_list, p_dict, 1)
到
product_list = add_on_tree(parse, [], p_dict, 1)
正确渲染最后一行。这使我认为我的逻辑在列表为空时运行良好,但在必须插入现有结构时失败。
任何帮助将不胜感激。提前谢谢!
更新 - 解决方案
正如@matt指出错误在:
else:
p["sub"] = ["Error Somewhere", p["type"]]
return plist
以下更改消除了错误:
else:
return plist
PS - 我已经用平面数据取代了嵌套。嵌套(处理)应留给最终应用程序。否则会产生比解决更多的麻烦。
答案 0 :(得分:1)
你的功能非常复杂,但我认为我看到了眼前的问题:
else:
p["sub"] = ["Error Somewhere", p["type"]]
return plist
如果列表中的第一项与您要搜索的类型不匹配,则会出错。相反,如果在没有找到所需类型的情况下遍历列表,则应该出错。
尝试在循环后进行错误检查。