如何通过脚本手动使这个JSON有效?

时间:2017-05-25 22:34:05

标签: python json

我目前有这样的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代码的提示或一些启动代码吗?

2 个答案:

答案 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列表。