【发布时间】:2014-04-08 22:20:48
【问题描述】:
我们有一个用 Perl Dancer 编写的 REST Web 服务。它以 YAML 格式返回 perl 数据结构,并接受 YAML 格式的参数 - 它应该与其他一些使用 Python 查询它的团队一起使用。
这就是问题所在——如果我只是通过 Dancer 的序列化传回一个常规的旧 perl 哈希,那么一切都可以正常工作。 JSON、YAML、XML……它们都能胜任。
但是,有时我们需要传回 Perl 对象,Python 稍后可以将其作为参数传回以帮助进行不必要的加载等。发现 YAML 是唯一能与 Dancer 中 Perl 的祝福对象一起工作的。
问题在于 Python 的 YAML 无法解析 Perl 对象的 YAML(而它可以毫无问题地处理常规的旧 perl 哈希 YAML)。
perl 对象在 YAML 中的开头是这样的:
第一个:
--- &1 !!perl/hash:Sequencing_API
第二:
--- !!perl/hash:SDB::DBIO
这样会出错。
yaml.constructor.ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:perl/hash:SDB::DBIO'
常规文件似乎是这样传递的:
---
fields:
library:
--- 之后的额外内容似乎导致了问题。我能做些什么来解决这个问题?还是我试图通过传递 Perl 对象来做太多事情?
【问题讨论】:
-
你能把你的整个 yaml 和生成它的 perl 放进去吗?
-
它很大,而且有一些敏感的东西——我认为我的工作不允许我这样做。 :(
-
也许可以做一个最小的例子来演示这个问题,包括生成 yaml 的 perl 代码,并完成 yaml ......(例如,只祝福一个随机对象并给我 yaml ......我没有 perl ...)
-
好吧,我追查到导致问题的原因
--- !!perl/hash:SDB::DBIO。 YAML 文件希望在---之后有“关键”部分,对吧?或者对于 Python 对象,紧随其后的是!!python...。 PyYAML 正在崩溃,因为它在之后立即运行到!!perl- 即使对于我的对象,如果我在将其转换为字符串或类似的东西之后解析该部分,它也可以正常工作。