如何以 JSONL 序列化 YAML 样式的集合?
How to JSONL serialize sets in YAML style?
常见的格式有以下三种:
众所周知,
- JSON can not handle Python sets without custom encoders/decoders.
- YAML 1.2 is strict superset of JSON
- JSONL是JSON写在一行
我想序列化(和反序列化)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
常见的格式有以下三种:
众所周知,
- JSON can not handle Python sets without custom encoders/decoders.
- YAML 1.2 is strict superset of JSON
- JSONL是JSON写在一行
我想序列化(和反序列化)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