【问题标题】:How do I maintain the same structure when reading from, modifying and writing back to a JSON file?在读取、修改和写回 JSON 文件时,如何保持相同的结构?
【发布时间】: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


【解决方案1】:

正如我在评论中所说,您可以使用collections.OrderedDict 以及json.load()(在Python 2.7 中)接受的可选object_pairs_hook 关键字参数来在重写文件时保留原始数据的顺序。

这就是我的意思:

#!/usr/bin/env python2
from collections import OrderedDict
import json


with open('ordered_data.json', 'r+') as f:
    data = json.load(f, object_pairs_hook=OrderedDict)
    temp_key = {"test": "val"}
    data["test"]["new_key"] = temp_key
    f.seek(0)  # Reset file position to the beginning.
    json.dump(data, f, indent=2)
    f.truncate()  # Remove remaining part.

【讨论】:

    猜你喜欢
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2018-06-23
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多