【发布时间】:2020-10-17 21:54:35
【问题描述】:
众所周知的格式有以下三种:
众所周知,
- JSON can not handle Python sets without custom encoders/decoders。
- YAML 1.2 is strict superset of JSON
- JSONL 是用一行写成的 JSON
我想将 Python 集(也可能是其他对象)序列化(和反序列化)成一行(JSON 或 YAML 无关紧要),就像 JSONL + 自定义编码器/解码器一样,但以一种人类可读的方式(如 Python 中的 repr(),参见下面的示例)(并且可能与 YAML 兼容)。我还想保留所有其他功能并避免使用workarounds。
我必须编写自己的自定义编码器还是有更好/现有的解决方案? (例如,yaml.dump() 的参数在一行中完成)实现以下示例的最稳健的方法是什么?
例如:
data = [1, 2, 3, {'say', 'knights', 'ni', 'who'}, {'key': 'value'}, 3.14]
data_dumped = dump(data, ...) # Magic dump function
print(data_dumped)
[1, 2, 3, !!set {knights: null, ni: null, say: null, who: null}, {"key": "value"}, 3.14]
data_loaded = load(data_dumped, ...) # Magic load function
assert data == data_loaded
更新:我已经链接了答案,展示了猴子修补 JSONEncoder 使 set()(和其他类型)可以使用 pickle 序列化,这不是人类可读的,因此他们不回答这个问题.如果这些类型的答案在没有修改的情况下是好的,那么这个问题将与引用的问题重复。
【问题讨论】:
-
这个问题最独特的部分是序列化输出必须是人类可读的,例如Python 中的 repr()。您建议的问题/答案不满足此要求(它使用转义的腌料,就像其他链接的答案一样)。但是,它们是编码器/解码器框架的不错补丁,可以改进为人类可读。由于它涉及猴子修补,因此以下答案更适合当前问题,即使它是 YAML,而不是 JSON。
标签: python json set yaml jsonlines