格式化大量JSON数据
我从学校的课程注册系统成功抓取了大约一兆字节的数据。我构建了一个对象图,然后把它保存成了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
}