考虑下面的JSON数据:
{
"postdata": {
"items": [
{
"productid1": "ZPB-3166",
"quantity1": 1
},
{
"productid2": "ZPB-1",
"quantity2": 1
}
],
"xyz": 1
}
}
我需要解析这个嵌套的JSON以获得键值对。但我需要保留嵌套JSON的信息。例如,我需要
postdata_items_productid=ZPB-3166 postdata_items_quantity=1 ... postdata_items_xyz=1
我如何在Python中实现它?
我尝试了以下代码,但它只解析了keyvalue对,并且嵌套的密钥信息丢失了。
import json
data=u'''{"postdata" :{"items":[{"productid":"ZPB-3166","quantity":1},{"productid":"ZPB-1","quantity":1},{"productid":"ZPB-2","quantity":2},{"productid":"ZPB-3","quantity":3}],"xyz":1}}'''
jsondata=json.loads(data)
def _parse_json(dictionary,parse_data):
for key, value in dictionary.iteritems():
if isinstance(value, dict):
_parse_json(value,parse_data)
elif isinstance(value,list):
for item in value:
if isinstance(item,dict):
_parse_json(item,parse_data)
else:
parse_data.append((key,value))
return parse_data
parse_data=[]
final_data=_parse_json(jsondata,parse_data)
print final_data
代码的结果是[(u'数量',1),(u' productid',u' ZPB-3166'),(u'数量',1),(u' productid',u' ZPB-1'),(u'数量',2),(u' productid&# 39;,u' ZPB-2'),(u'数量',3),(u' productid',u' ZPB-3'), (你' xyz',1)]但是需要的是postdata_items_productid,postdata_items_xyz等,而不是productid或xyz。
答案 0 :(得分:0)
结帐flatten_json。输出与您所拥有的差异(实际上可能是您想要的功能)是flatten_json不会丢失嵌套列表中元素的索引。因此,您可以完全重建平坦的对象(否则您无法做到)。
如果您确实需要自定义解决方案,则可以检查源代码并使用它来派生自己的自定义解决方案。
import json
from flatten_json import flatten_json
text = #...
print flatten_json(json.loads(text))
输出:
{'postdata_items_0_quantity1':'1','postdata_xyz':'1','postdata_items_1_quantity2':'1','postdata_items_0_productid1':'ZPB-3166','postdata_items_1_productid2':'ZPB-1'}