使用嵌套密钥解析嵌套的json保留的信息

时间:2016-11-11 09:54:17

标签: python json parsing

考虑下面的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。

1 个答案:

答案 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'}