2017-08-24 70 views
0

我有一个要带一个大的JSON文件,并通读结构,抓住其中关键匹配的一切东西,然后储存多个项目的程序形成结构到数据库中。问题是,有时结构仍处于关闭状态,只有一个项目...所以如下:阅读非即使JSON与Python

   "stats": { 
        "first": [ 
         { 
          "name": "Name1", 
          "context": "open", 
          "number": "139" 
         }, 
         { 
          "name": "Name2", 
          "context": "opener", 
          "number": "135" 
         } 
        ], 
        "second": { 
         "name": "Name1", 
         "context": "opener", 
         "amount": "1.5", 
         "number": "-125" 
        }, 
        "third": [ 
         { 
          "name": "Name1", 
          "context": "open", 
          "amount": "8.5", 
          "number": "-110" 
         }, 
         { 
          "name": "Name2", 
          "context": "open", 
          "amount": "9.0", 
          "number": "-120" 
         } 
        ] 
       } 
      }, 

所以,你会发现,第二个只有一个入口,所以它的结构不同......我我试过的条件比我想象的要多......我如何检查它是否是单一条目并向前移动?这可能是很简单的,我只是在亏损,而不是最好的Python数据结构(当然)。

我在做什么后grabbign像第三[0] [“名”],并把它变成一个数据库...所以我得到一个索引错误,当我尝试第二个节点上。另外 - 在一些节点中,第二个将有多于一个......在其他节点中不会......完全取决于该记录。

+0

您可以处理'IndexError'的ð假设,这意味着你有一个字典不是一个列表:https://docs.python.org/3/tutorial/errors.html – jonrsharpe

+0

你也应该找到谁生成该文件的人,[有鳟鱼一巴掌他们] (https://www.youtube.com/watch?v=IhJQp-q1Y1s)。 – wim

+0

考虑我们支付TEH饲料,我也带不起来。 – Jenni

回答

3

我会首先将其解析到一个JSON,然后更新您描述具有键,如"first"字典,"second"等如下:

def repair_dict(d): 
    for k in list(d): 
     v = d[k] 
     if not isinstance(v,list): 
      d[k] = [v] 

因此,它的维修,如数据:

>>> d = json.loads(data) 
>>> d 
{'stats': {'third': [{'context': 'open', 'name': 'Name1', 'number': '-110', 'amount': '8.5'}, {'context': 'open', 'name': 'Name2', 'number': '-120', 'amount': '9.0'}], 'second': {'context': 'opener', 'name': 'Name1', 'number': '-125', 'amount': '1.5'}, 'first': [{'context': 'open', 'name': 'Name1', 'number': '139'}, {'context': 'opener', 'name': 'Name2', 'number': '135'}]}} 
>>> repair_dict(d['stats']) 
>>> d 
{'stats': {'third': [{'context': 'open', 'name': 'Name1', 'number': '-110', 'amount': '8.5'}, {'context': 'open', 'name': 'Name2', 'number': '-120', 'amount': '9.0'}], 'second': [{'context': 'opener', 'name': 'Name1', 'number': '-125', 'amount': '1.5'}], 'first': [{'context': 'open', 'name': 'Name1', 'number': '139'}, {'context': 'opener', 'name': 'Name2', 'number': '135'}]}} 

或者当漂亮的印刷:

>>> pprint.pprint(d) 
{'stats': {'first': [{'context': 'open', 'name': 'Name1', 'number': '139'}, 
        {'context': 'opener', 'name': 'Name2', 'number': '135'}], 
      'second': [{'amount': '1.5', 
         'context': 'opener', 
         'name': 'Name1', 
         'number': '-125'}], 
      'third': [{'amount': '8.5', 
         'context': 'open', 
         'name': 'Name1', 
         'number': '-110'}, 
        {'amount': '9.0', 
         'context': 'open', 
         'name': 'Name2', 
         'number': '-120'}]}} 
+0

Hmmmm至更具体地,我使用json.loads装载数据: 'H = requests.get(OPENER_URL)'' = NEW_DATA json.loads(h.text)' – Jenni

+1

@Jenni:这不是点的答案。然后,您可以在生成的字典中需要修复的部分上调用'repair_dict'。检查第二个代码片段以查看字典如何更改。 –

+0

哦!谢谢 - 我在这里游泳......每一次接到的电话都变得越来越糟糕。我会试试这个,看看我能不能做到这一点! – Jenni