首页 > 解决方案 > Python json总是第一次失败

问题描述

我正在尝试使用 python 格式化一个 json 文件。

我拥有的实际 json 文件如下所示:

{"@timestamp":"2021-08-01T00:17:04.301Z","name":"name","message":"EndPoint Operation","deviceAction":"Blocked"}{"@timestamp":"2021-08-01T00:26:35.250Z","name":"name","deviceAction":"DENIED"}

如您所见,文件格式不正确,因为缺少逗号。

所以我有这个函数来添加逗号并使其成为一个对象数组。

def structure_json():
    with open("./zip/file.json", "r+") as f:
        old = f.read()
        f.seek(0)  # rewind
        f.write(old.replace('}{', '},{'))
        tmps = '[' + str(old) + ']'
        json_string = json.loads(tmps)
        for key in json_string:
            to_queue.append(key)
        f.close

structure_json()

该脚本正是我需要他做的,它确实添加了逗号和数组,但出于某种原因。如果我放置一个具有相同问题的新 json 文件并运行我的脚本,它确实会失败,并给出以下错误:

json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 119 (char 118)

这与 json 的第一行有关。我确实相信这个问题是由于f.read()which 是第一个被调用的,并且在给定的时间 json 没有被格式化。但即使它确实失败了,我打开文件,我看到它的格式是正确的,所以如果我再次运行脚本,一切都会正常工作。

谁能帮我解决这个问题?因为我拥有的函数只是格式化文件后需要发生的一系列事件中的第一个元素,我每次可以运行两次脚本。

非常感谢大家。

标签: jsonpython-3.x

解决方案


由于您没有将替换的值保存回旧变量,因此它仍然包含不正确的 json

def structure_json():
    with open("./zip/file.json", "r+") as f:
        old = f.read()
        f.seek(0)  # rewind
        # save to the old string after replace
        new = old.replace('}{', '},{')
        f.write(new)
        tmps = '[' + str(new) + ']'
        json_string = json.loads(tmps)
        for key in json_string:
            to_queue.append(key)
        f.close

structure_json()

推荐阅读