2017-08-24 6 views
0

私は、大規模なJSONファイルを取得し、構造体を読み込み、キーが何かにマッチするところをすべて把握し、その構造体をデータベースに格納する多数の項目を格納するプログラムを持っています。私は...Pythonでun-even JSONを読む

   "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" 
         } 
        ] 
       } 
      }, 

をだから、それは異なる構造ですので、あなたは、第二にエントリが1つだけあることに気づくでしょう:問題は次のように...一つだけのアイテムがある場合には、時々構造がオフになっているということです私は考えることができるより多くの条件を試しました...それが単一のエントリであるかどうかを確認し、前進しますか?これはおそらく本当に単純ですが、私は失われてしまいましたが、Pythonのデータ構造では最高のものではありません。

3番目の[0] ['name']のようにgrabbignしてデータベースに入れています...その2番目のノードを試してみるとインデックスエラーが発生します。また、いくつかのノードでは、2番目に複数のノードがあります。他のノードでは、完全にレコードに依存しません。

+0

は 'IndexError' dはあなたがリストではなく辞書を持っていることを意味しています:https://docs.python.org/3/tutorial/errors.html – jonrsharpe

+0

また、ファイルを生成した人と、[troutでそれらを叩く] (https://www.youtube.com/watch?v=IhJQp-q1Y1s)。 – wim

+0

私たちが飼料を払っていることを考えれば、私はそれを持ち出しています。 – 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

うーむ、より具体的に、私はjson.loadsを使用してデータをロードAM: 'H = requests.get(OPENER_URL)' ' NEW_DATA = json.loads(h.text)' – Jenni

+1

@Jenni:それはポイントではありません答えの結果の辞書の修復が必要な部分に対して 'repair_dict'を呼び出すことができます。 2番目のコード断片をチェックして、辞書の変更方法を確認してください。 –

+0

OH!ありがとうございます - 私はここで泳いでいます...そして結果として得られるすべてのコールは悪化しています。私はこれを試して、私がその仕事をすることができるかどうかを見てみよう! – Jenni