如何以YAML样式对集进行JSONL序列化?

问题描述

有三种众所周知的格式:

众所周知,

我想将Python集(也可能是其他对象)序列化(和反序列化)到一行( JSON或YAML无关紧要),就像JSONL +自定义编码器/解码器一样,但以人类可读的方式(例如Python中的repr()@H_502_26@,请参见下面的示例)(并且可能符合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,!!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
@H_502_26@

更新:我链接了一些答案,这些猴子展示了猴子修补过的JSONEncoder@H_502_26@,使得set()@H_502_26@(以及其他类型)可以使用pickle@H_502_26@进行序列化,因此这是人类无法理解的,因此他们没有回答这个问题。如果这些答案在未经修改的情况下都是好的,那么该问题将与引用的问题重复。

解决方法

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

查看示例:

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,!!set {knights: null,ni: null,say: null,who: null},{"key": "value"},3.14]
data_loaded = load(data_dumped)
assert data == data_loaded