解析带有反斜杠的非常大的 JSON 文件(JSON 编码)

Parsing a very large JSON file with backslashes (JSON encoded)

我想从 Python 中的一个非常大的 JSON 文件中获取一些数据。问题是这个文件有超过 15,000,000 列(单行),我不知道如何通过格式设置,因为这个 JSON 文件有很多反斜杠和 starts/ends 带引号。

这是我的 Python 代码:

import json
from pprint import pprint

with open('file.json') as f:
    data = json.load(f)

for i in range(0, 2):
    pprint("Data output: " + data['ObjectData'][i]['column1'])

当我从那个 JSON 文件中手动复制一个对象并像这样正确格式化它时,这非常有效:

{
    "Result": "Result String",
    "ObjectData": [
        {
            "Column 1": "Data",
            "Column 2": "Data",
            "Column 3": "Data",
            "Column 4": "Data",
            "Column 5": "Data",
        },
        {
            "Column 1": "Data 2",
            "Column 2": "Data 2",
            "Column 3": "Data 2",
            "Column 4": "Data 2",
            "Column 5": "Data 2",
        }
    ]
} 

我的输出是这样的,这正是我想要的。

Data output: Data
Data output: Data 2

但这是文件的实际格式,用双引号括起来(为了便于阅读,我在此处设置了格式,但下面粘贴了单行示例):

"{
\"Result\":\"Result String\",
\"ObjectData\":[
{
\"Column 1\":\"Data\",
\"Column 2\":\"Data\",
\"Column 3\":\"Data\",
\"Column 4\":\"Data\",
\"Column 5\":\"Data\"
},
{
\"Column 1\":\"Data 2\",
\"Column 2\":\"Data 2\",
\"Column 3\":\"Data 2\",
\"Column 4\":\"Data 2\",
\"Column 5\":\"Data 2\"
}]}"

文件中的实际情况如下:

"{\"Result\":\"Result String\",\"ObjectData\":[{\"Column 1\":\"Data\",\"Column 2\":\"Data\",\"Column 3\":\"Data\",\"Column 4\":\"Data\",\"Column 5\":\"Data\"},{\"Column 1\":\"Data 2\",\"Column 2\":\"Data 2\",\"Column 3\":\"Data 2\",\"Column 4\":\"Data 2\",\"Column 5\":\"Data 2\"}]}"

我的第一个想法是尝试将代码美化为我想要的格式。但是,正如我提到的那样,它是一个非常大的 JSON 文件,包含 1500 万列,所以它永远 运行 不会崩溃。

有没有更简单的方法来处理这个问题?我一直试图找出我是否遗漏了这里的基本原则,但我从未见过这样格式化的 JSON。

感谢任何指导,非常感谢。

JSON 文件好像被双重编码了。或许你可以

with open('file.json') as f:
    decoded_once = json.load(f)
    data = json.loads(decoded_once)

仅从那段摘录中很难判断发生了什么。

如果失败,可能是因为外部字符串来自 Python 而不是 ,解决方法是在第一步中使用 ast.literal_eval

import ast
with open('file.json') as f:
    decoded_once = ast.literal_eval(f.read())
    data = json.loads(decoded_once)