【问题标题】:Custom encode dictionary values based on key name根据键名自定义编码字典值
【发布时间】:2021-08-15 23:54:14
【问题描述】:

是否可以根据键名将字典值自定义编码为 JSON?

假设我有

mydict = {
    "mylist1": ["a", "b", "c"],
    "mylist2": ["a", "b", "c"],
    "mylist3": ["a", "b", "c"]}

我想转储 "mylist1" 而不使用缩进,仅基于其名称,但字典的其余部分使用常规 json 编码器。所以像:

{
    "mylist1": [ "a","b","c"],
    "mylist2": [
        "a",
        "b",
        "c"
    ],
    "mylist3": [
        "a",
        "b",
        "c"
    ]
}

我受到this SO question 的启发,其中使用“indicator-class”来标记 dict 条目。这也适用于我的情况,但是我的 JSON 文件被打开,内容被解析和修改,然后再次保存,因此指标类 (NoIndent) 丢失了。

如果基于键名的编码涉及太多,如果我可以转储所有列表(和数组!)而无需缩进或作为字符串,我已经很高兴了。我试过了,但没有用(自定义编码器无法启动):

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return str(list(obj))
        elif isinstance(obj, list):
            return str(obj)
        return json.JSONEncoder.default(self, obj)

编辑:我编辑了问题以使输入/输出更加清晰

【问题讨论】:

  • 我不太明白 - 你能举个例子说明你希望输出的样子吗?
  • 完成。我主要是想让我的 JSON 文件对人眼更易读,因为我有一些长长的列表,里面充满了原始数据,但在较短的列表和字典中也有有意义的信息

标签: python json


【解决方案1】:

Python json 实现不允许您轻松更改内置 Python 类的行为。除了您链接的问题之外,还有另一个 Stack Overflow 问题:How to change json encoding behaviour for serializable python object?

但是由于文件稍后会被重新解析和重写,如果执行此操作的软件不理解您的约定,您对格式化的偏好将会丢失。您可以确保文件不会被修改,或者找到一种方法仅在向用户显示时才显示这种漂亮的格式,而不是在存储中。一般来说,为了展示而美化文件会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2021-02-02
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多