使用Python

时间:2017-08-24 19:45:13

标签: python json dictionary data-structures iteration

我有一个程序正在获取一个大型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"
                        }
                    ]
                }
            },

所以,你会注意到第二只有一个条目,所以它的结构不同......我尝试了比我想象的更多的条件...我如何检查它是否是单个条目并继续前进?这可能非常简单,我只是茫然而不是Python数据结构中最好的(诚然)。

我正在做的是像第三个[0] ['name']一样抓取并将其放入数据库...所以当我尝试第二个节点时,我得到一个索引错误。另外 - 在某些节点中,第二个WILL有多个......在其他节点中它不会......完全取决于记录。

1 个答案:

答案 0 :(得分: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'}]}}