格式化大量JSON数据

0 投票
4 回答
555 浏览
提问于 2025-04-18 06:47

我从学校的课程注册系统成功抓取了大约一兆字节的数据。我构建了一个对象图,然后把它保存成了JSON格式。

Python给我生成了一个很大的混合字符串,存放在一个文件里,我想用文本编辑器把它格式化得更好看。我想,如果我在Xcode里打开这个文件,把逗号替换成换行加逗号,那我就完成了一半。然后我可以按下控制键加i,Xcode就会帮我自动缩进。

不过,搜索和替换、缩进以及语法高亮在中间的某个地方似乎都出现了问题。我怀疑是JSON格式不正确,但数据量太大,我不能仅仅凭眼睛去找出问题并自己调整。

我用以下代码在写入数据:

file_object = open(file_name,'wb')

json_data = jsonpickle.encode(data)

file_object.write(json_data)

你知道怎么诊断这个问题,或者可能是什么原因吗?

4 个回答

0

可以使用jsonlint这个命令行工具。

它会检查你的JSON文件是否有错误,并且可以把它格式化输出,如果你需要的话。

我是在vim编辑器中使用它的,把当前文件作为输入,然后得到格式化后的输出(或者错误信息,如果有问题的话)。

你也可以在命令行中进行格式化或验证,然后再在编辑器中继续处理文件。

我把Python命令行的检查(对于Python用户来说总是很方便)和jsonlint的结果进行了比较,使用的是以下文件:

{
    "camera_matrix": [
        [
            532.80990646,
            0.0,
            342.49522219
        ],
        [
            0.0,
            532.93344713,
            233.88792491,
        ],
        [
            0.0,
            0.0,
            1.0
        ]
    ],
    "dist_coeff": [
        -0.281325798,
        0.0291150014,
        0.00121234399,
        -0.000140823665,
        0.154861424
    ]
}

Python版本:

$ python -m json.tool invalid.json
No JSON object could be decoded

jsonlint

$ jsonlint invalid.json
[Error: Parse error on line 1:
...3.88792491,
        ],
        [

-----------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got ']']

对我来说,jsonlint给出的结果更好。同时我也得承认,相比于已经安装Python,使用这个工具需要多一些安装步骤,但在我的开发机器上,我并不介意这些。

0

使用 json 而不是 jsonpickle

import json

with open(file_name,'rw+') as data:
    json_data = json.loads(data.read())
    data.seek(0)
    json.dump(json_data, data, sort_keys=True, indent=2)
    data.truncate()

这段代码会打开一个文件,加载里面的json对象,然后用格式化后的内容覆盖原来的文件。

1

你甚至不需要写脚本来完成这个,直接使用 json.tool 模块就可以了:

$ cat foo.json 
{ "a": 1, "c": 3, "b": 2
}
$ python -mjson.tool foo.json 
{
    "a": 1,
    "b": 2,
    "c": 3
}

它还可以检查你的 JSON 语法是否正确:

$ cat bar.json 
{ "a": 1 @#!@ not a proper json }
$ python -mjson.tool bar.json 
Expecting , delimiter: line 1 column 10 (char 9)
1

请注意,json导出时有一个缩进参数。

>>> print json.dumps({"a": 1, "b": 2, "c": 3})
{"a": 1, "c": 3, "b": 2}
>>> print json.dumps({"a": 1, "b": 2, "c": 3}, indent=4)
{
    "a": 1, 
    "c": 3, 
    "b": 2
}

撰写回答