【问题标题】:How to JSONL serialize sets in YAML style?如何 JSONL 序列化 YAML 样式的集合?
【发布时间】:2020-10-17 21:54:35
【问题描述】:

众所周知的格式有以下三种:

众所周知,

我想将 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 序列化,这不是人类可读的,因此他们不回答这个问题.如果这些类型的答案在没有修改的情况下是好的,那么这个问题将与引用的问题重复。

【问题讨论】:

  • 你查看我对Making object JSON serializable with regular encoder的回答了吗?
  • 这个问题最独特的部分是序列化输出必须是人类可读的,例如Python 中的 repr()。您建议的问题/答案不满足此要求(它使用转义的腌料,就像其他链接的答案一样)。但是,它们是编码器/解码器框架的不错补丁,可以改进为人类可读。由于它涉及猴子修补,因此以下答案更适合当前问题,即使它是 YAML,而不是 JSON。

标签: python json set yaml jsonlines


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2013-09-18
    • 2023-03-03
    相关资源
    最近更新 更多