【发布时间】:2020-02-19 05:00:34
【问题描述】:
我目前正在读取一个 JSON 文件,添加一个密钥并使用此过程将其写回同一个文件
with open('data.json', 'r+') as f:
data = json.load(f)
temp_key={"test":"val"}
data["test"]["new_key"] = temp_key
f.seek(0) # <--- should reset file position to the beginning.
json.dump(data, f, indent=2)
f.truncate() # remove remaining part
(取自here)
但问题是它不能维持秩序。例如,如果我阅读:
{
"test": {
"something": "something_else"
},
"abc": {
"what": "huh"
}
}
输出结果如下:
{
"abc": {
"what": "huh"
},
"test": {
"something": "something_else",
"new_key": {
"test": "val"
}
}
}
当我希望它是:
{
"test": {
"something": "something_else",
"new_key": {
"test": "val"
}
},
"abc": {
"what": "huh"
}
}
我意识到 JSON 是基于键/值的结构,顺序无关紧要,但是有没有办法进行修改并保持原始结构?
【问题讨论】:
-
@user2883071 正如您所提到的,顺序不是 JSON 规范的一部分,那么为什么它对您很重要?如果您依赖订购的 JSON 数据,那么这无论如何都是无效的。
-
@a_guest 如果你想在文件的旧版本和新版本之间有一个可读的差异,这很重要
-
@wim 这完全依赖于实现细节。如果
json模块在转储之前对每个字典进行了洗牌,那也是完全有效的(根据 JSON 规范)。如果你想区分 data (即包含的信息,而不是文件),那么你应该首先解析,然后区分解析的数据结构。两个 JSON 文件 之间的差异没有意义。 -
@a_guest 我明白了。然而在实践中,许多人使用 json 格式的配置文件,并将这些文件存储在 git 中。诸如 github 的 Web UI 之类的常用工具不会为您提供与顺序无关的差异,因此想要保持顺序的加载和转储往返是可以理解的。务实。
标签: python json python-2.x