如何使用Python读取自定义序列化的YAML对象(由Rails编写)?

2024-10-02 04:35:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是一个在一列中包含序列化值的Rails数据库。这些值应该是常规的Hash,但由于不正确地清理参数,它们被存储为HashWithIndifferentAccess或{}。例如,一个列条目如下所示:

--- !ruby/object:ActionController::Parameters
parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  windowHeight: 946
  documentHeight: 3679
  scrollTop: 500
permitted: false

我想用Python的yaml实现来阅读本文,但是当我尝试这样做时,我得到:

^{pr2}$

所以,出于某种原因,它需要一个构造函数。但很明显,值本身只是一个普通字典。我怎么还能读呢?在


Tags: 数据库参数序列化object条目hash常规parameters
1条回答
网友
1楼 · 发布于 2024-10-02 04:35:36

您可以使用PyYAML解析器的add_constructor(loader, node)函数,该函数允许您为它无法识别的对象类型实现自定义构造函数。在

在该构造函数中,可以调用函数loader.construct_pairs(node),以从原始节点内容获取键值元组。使用字典理解,我们可以创建原始词典。在

由于条目是嵌套的,所以我们必须对这两种对象类型应用构造函数。在

一个完整的例子如下:

import yaml

def convert_entry(loader, node):
    return { e[0]: e[1] for e in loader.construct_pairs(node) }

yaml.add_constructor('!ruby/hash:ActiveSupport::HashWithIndifferentAccess', convert_entry)
yaml.add_constructor('!ruby/object:ActionController::Parameters', convert_entry)

yaml.load(input_string)

这是somehow documented,但是很难找到很多例子。在

相关问题 更多 >

    热门问题