Python 如何通过脚本手动使此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":

我目前有类似这样的JSON可用。一个名为
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。