【问题标题】:Reading un-even JSON with Python用 Python 读取不均匀的 JSON
【发布时间】:2018-02-02 19:35:18
【问题描述】:

我有一个程序,它获取一个 LARGE 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"
                        }
                    ]
                }
            },

所以,您会注意到 second 只有一个条目,所以它的结构不同......我尝试了比我能想到的更多的条件......我如何检查它是否是一个条目并继续前进?这可能真的很简单,我只是不知所措,而不是最擅长 Python 数据结构(诚然)。

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

【问题讨论】:

标签: python json dictionary data-structures iteration


【解决方案1】:

我会先将其解析为 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'}]}}

【讨论】:

  • 嗯,更具体地说,我正在使用 json.loads 加载数据:h = requests.get(OPENER_URL)new_data = json.loads(h.text)
  • @Jenni:这不是答案的重点。然后,您可以在结果字典中需要修复的部分上调用repair_dict。检查第二个代码片段,看看字典是如何变化的。
  • 哦!谢谢 - 我正在这里游泳......每次通话都变得更糟,哈哈。我要试试这个,看看能不能成功!
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
相关资源
最近更新 更多