json - 通过在 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)
不够的。
解决方案
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'
.
推荐阅读
- python - 使用beautifulsoup在数组中find_all只返回前几个结果
- python - 最适合与 Python 集成或为 Python 提供最佳 API 的 Magento 或 Shopify
- episerver - 在 EpiServer 中删除 IUser 时出错 - SqlException:执行超时
- python - 用于在 Python 3.7 中使用 zipfile 工作的串联 zip 文件的“文件头的坏幻数”
- node.js - 弹性搜索过滤器
- charts - 如何自定义 domainAxis LineChart flutter_charts
- php - 如何在 jQuery 中收集动态字段数据并将其传递给 AJAX 并在 PHP 中一一检索?
- javascript - 有什么方法可以在关闭浏览器时终止会话?我使用了 onunload 和 onbeforeunload 事件。但它不起作用
- android - 如何清除回收站视图中突出显示的项目?
- java - Math.pow() 正在返回一个意外的结果