首页 > 解决方案 > 通过在 for 循环中转储字典来保存 json 文件,导致 json 格式错误

问题描述

所以我有以下通过解析文本文件得到的字典

keys = ["scientific name", "common names", "colors]
values = ["somename1", ["name11", "name12"], ["color11", "color12"]]

keys = ["scientific name", "common names", "colors]
values = ["somename2", ["name21", "name22"], ["color21", "color22"]]

等等。我使用字典将键值对转储到使用 for 循环的 json 文件中,在其中我一个一个地遍历每个键值对

for loop starts
    d = dict(zip(keys, values))
    with open("file.json", 'a') as j:
        json.dump(d, j)

如果我打开保存的 json 文件,我会看到内容为

{"scientific name": "somename1", "common names": ["name11", "name12"], "colors": ["color11", "color12"]}{"scientific name": "somename2", "common names": ["name21", "name22"], "colors": ["color21", "color22"]}

这是正确的方法吗?

目的是查询给定学名的通用名称或颜色。那么我做

with open("file.json", "r") as j:
    data = json.load(j)

我收到错误消息,json.decoder.JSONDecodeError: Extra data: 我认为这是因为我没有在 for 循环中正确地转储 json 中的字典。我必须以编程方式插入一些方括号。光做是json.dump(d, j)不够的。

标签: jsonpython-3.x

解决方案


JSON 可能只有一个根元素。此根元素可以是[]{}大多数其他数据类型。

但是,在您的文件中,您会获得多个根元素:

{...}{...}

这不是有效的 JSON,错误Extra data指的是第二个{},有效的 JSON 将在该处结束。

您可以将多个 dicts 写入 JSON 字符串,但您需要将它们包装在一个数组中:

[{...},{...}]


但现在开始讨论我将如何修复您的代码。首先,我重写了您发布的内容,因为您的代码相当伪代码并且没有直接运行。

import json

inputs = [(["scientific name", "common names", "colors"],
           ["somename1", ["name11", "name12"], ["color11", "color12"]]),
          (["scientific name", "common names", "colors"],
           ["somename2", ["name21", "name22"], ["color21", "color22"]])]

for keys, values in inputs:
    d = dict(zip(keys, values))
    with open("file.json", 'a') as j:
        json.dump(d, j)

with open("file.json", 'r') as j:
    print(json.load(j))

正如您正确意识到的那样,此代码失败了

json.decoder.JSONDecodeError: Extra data: line 1 column 105 (char 104)

我写它的方式是:

import json

inputs = [(["scientific name", "common names", "colors"],
           ["somename1", ["name11", "name12"], ["color11", "color12"]]),
          (["scientific name", "common names", "colors"],
           ["somename2", ["name21", "name22"], ["color21", "color22"]])]

jsonData = list()
for keys, values in inputs:
    d = dict(zip(keys, values))
    jsonData.append(d)

with open("file.json", 'w') as j:
    json.dump(jsonData, j)

with open("file.json", 'r') as j:
    print(json.load(j))

此外,对于 python 的json库,一次编写整个 json 文件很重要,这意味着使用'w'而不是'a'.


推荐阅读