Python 如何通过脚本手动使此JSON有效?
我目前有类似这样的JSON可用。一个名为Python 如何通过脚本手动使此JSON有效?,python,json,Python,Json,我目前有类似这样的JSON可用。一个名为test.json的文件中存储了800个对象,但格式无效。我已经展示了下面800个对象中的2个: { "_id": { "$oid": "592638e163690a5c1f8f73e2" }, "title": "simplifying fractions", "url": "some_url", "difficulty": "easy", "webview": "", "id":
test.json
的文件中存储了800个对象,但格式无效。我已经展示了下面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
}
}
现在在上面的版本中,它通过了皮棉。在第一个版本中,我只是有800个JSON对象,我想将其转换为上面的版本,在上面我们有一个大字典,然后是一个键,如
“0”
,“1”
,后面是JSON对象。我不知道如何开始创建python脚本。有人能给我一个提示或一些起始代码,告诉我如何解析第一个无效的JSON代码吗?我建议将您的JSON转换为对象列表:
[ {}, {}, ... {} ]
你可以用[{
替换前面的{
,用}]
替换后面的}
,用}{
替换前面的{
,{使用编辑器中的搜索替换,自定义脚本,或者像sed
这样的命令行工具
生成的文件如下所示:
[{
"_id": {
"$oid": "592638e163690a5c1f8f73e2"
},
...
}, {
"_id": {
"$oid": "592638e163690a5c1f8f73f5"
},
...
}
这应该解析为有效的JSON,并转换为Python dict列表。好吧,这不是有效的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()
f=打开(“填充”)
oldjson=f.read();
newjson=“{\n”
newjson_element=“”
键=0
打开支架计数器=0
对于oldjson中的字符:
newjson_元素+=字符
如果字符==“{”:
打开支架计数器+=1
如果字符==“}”:
打开支架计数器-=1
如果打开_支架_计数器==0:
newjson=newjson+''''+str(键)+':'+newjson_元素+'\n'
newjson_element=“”
键+=1
如果打开支架计数器<0:
打印“结束大括号比打开大括号多-一些额外问题?”
如果newjson_element.strip()!=“”:
打印“最后一个完整元素后的一些字符-一些额外问题?”
newjson+=“}\n”
outfile=open(“outfile.json”,“w”)
outfile.write(newjson)
outfile.close()
这是一个快速脚本,因此如果元素的结尾}和下一个元素的开头{之间有任何非空白字符,它将生成无效的JSON。抱歉的可能重复-我使用Python 2,所以不知道,修复操作可能使用Python 3。