我目前有这样的JSON。有800个对象存储在一个名为test.json
的文件中,但格式无效。我在下面的800中显示了2个对象:
{
"_id": {
"$oid": "592638e163690a5c1f8f73e2"
},
"title": "simplifying fractions",
"url": "some_url",
"difficulty": "easy",
"webview": "",
"id": 0
} {
"_id": {
"$oid": "592638e163690a5c1f8f73f5"
},
"title": "patterns overlap",
"url": "some_url",
"difficulty": "hard",
"webview": "",
"id": 1
}
当我通过jsonlint.com
运行上面两个json对象时,我在第10行收到错误,说有一个解析错误。我想将其转换为类似于jsonlint.com
:
{
"0": {
"_id": {
"$oid": "592638e163690a5c1f8f73e2"
},
"title": "simplifying fractions",
"url": "some_url",
"difficulty": "easy",
"webview": "",
"id": 0
},
"1": {
"_id": {
"$oid": "592638e163690a5c1f8f73f5"
},
"title": "patterns overlap",
"url": "some_url",
"difficulty": "hard",
"webview": "",
"id": 1
}
}
现在在上面的版本中它传递了lint。在第一个版本中,我只有800个JSON对象,我想将其转换为上面的版本,我们在顶部有一个大字典,然后是"0"
,"1"
后跟JSON对象的密钥。我不知道如何开始创建python脚本。有人可以给我一个关于如何解析第一个无效JSON代码的提示或一些启动代码吗?
答案 0 :(得分:1)
嗯,它不是有效的JSON,所以不要把它解析为JSON。只需找到要在索引中使用的部分......这可以通过计算括号来完成。
f = open("infile")
oldjson = f.read();
newjson = "{\n"
newjson_element = ""
key = 0
open_brace_counter = 0
for character in oldjson:
newjson_element += character
if character == "{":
open_brace_counter += 1
if character == "}":
open_brace_counter -= 1
if open_brace_counter == 0:
newjson = newjson + '"' + str(key) + '": ' + newjson_element +'\n'
newjson_element = ""
key += 1
if open_brace_counter < 0:
print "more closing braces than opened braces - some extra problem?"
if newjson_element.strip() != "":
print "some characters after the last full element - some extra problem?"
newjson += "}\n"
outfile = open("outfile.json","w")
outfile.write(newjson)
outfile.close()
这是一个快速脚本,因此如果元素的最终}与下一个元素的开头之间存在任何非空白字符,它将产生无效的JSON。
答案 1 :(得分:0)
我建议将您的JSON转换为对象列表:
[ {}, {}, ... {} ]
您可以将{
替换为[{
,将}
替换为}]
,将每次{{1}}替换为} {
。使用编辑器中的搜索替换,自定义脚本或}, {
等命令行工具。
生成的文件如下所示:
sed
这应解析为有效的JSON并转换为Python dicts列表。