如何以 JSONL 序列化 YAML 样式的集合?

How to JSONL serialize sets in YAML style?

常见的格式有以下三种:

众所周知,

我想序列化(和反序列化)Python 集(可能还有其他对象)到一行(JSON 或 YAML 无关紧要 ), 就像 JSONL + custom encoder/decoder 会做的那样, 但以 人类可读的方式 (就像 [=60= 中的 repr() ], 参见下面的示例)(并且可能符合 YAML)。我还想保留所有其他功能并避免 workarounds.

我必须编写自己的自定义编码器还是有一些 better/existing 解决方案? (例如 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 可序列化,这是不是人类可读的,因此他们不回答这个问题。如果这些答案没有修改就很好,那么这个问题将与引用的答案重复。

类似于JSONL的“一行打印的YAML”格式被称为“内联语法”,可以用default_flow_style=True实现,但是this is very badly documented。结果不是 JSON,但仍然符合标准并且不需要自定义 encoder/decoder。

看例子:

from yaml import dump, load
data = [1, 2, 3, {'say', 'knights', 'ni', 'who'}, {'key': 'value'}, 3.14]
data_dumped = dump(data, default_flow_style=True)
print(data_dumped)
[1, 2, 3, !!set {knights: null, ni: null, say: null, who: null}, {"key": "value"}, 3.14]
data_loaded = load(data_dumped)
assert data == data_loaded