3

我有一系列 Moose 对象,我希望通过Catalyst::View::JSON将它们提供给JSON::XS。JSON::XS 无法编码祝福的数据结构。我知道有MooseX::Storage::Format::JSON可以——有点——做我想做的事;但是,它似乎过于沉重。我正在寻找的信息与XXX.pm提供的信息基本相同。我只希望原始数据结构递归地不被祝福,以便(内部使用的驱动程序)可以显示它。JSON::XSJSON::AnyC:V:JSON

使用对象Catalyst::View::JSON的最佳方式是什么?看来我有四个明显的选择:JSON::XSMoose

  1. 如果暴露的参数是 Moose 对象,则通过修补以读取并最终确定请求来使用MooseCatalyst::View::JSON对象C:V:JSONfreeze
  2. 补丁JSON::XS以回退到$obj->freeze if $obj->isa('Moose') && $obj->does('MooseX::Storage::Format::JSON'). 我应该调查MX:S:F:JSON以确保由JSON::Any和 proxy使用的类MX:S:F:JSON是(如果为调用使用的 Moose 对象选择不同的内部编码器,则JSON::XS讨厌想到大量的错误。JSON::AnyJSON::XS
  3. 弄清楚如何递归地取消并让它Catalyst::View::JSON做它的事情。
  4. 根本不要使用Catalyst::View::JSON。只需写入 STDOUT$obj->freeze并手动完成请求。这似乎是最骇人听闻的。

我敢肯定还有其他选择,有什么想法吗?我最好的选择是什么?

4

3 回答 3

5

我倾向于使用 MooseX::Storage 执行选项 3,以提供一种pack()方法,该方法返回一个 Perl 数据结构,我可以将其填充到我的存储中,以便 View 可以按照它的选择呈现它。

另请注意,JSON::Any 可以强制(通过环境,或通过将适当的参数传递给import())来选择特定的后端。这就是测试套件的工作方式,并记录在案。

于 2010-08-03T16:16:58.633 回答
4

如果您不关心完全取消祝福对象并使其完全无法使用(从 Moose 的角度来看),请尝试 unbless from Data::Structure::Util.

我个人更喜欢MooseX::Storage更优雅和可持续的解决方案。

于 2010-08-03T15:45:02.910 回答
1

喜欢或讨厌它,我的最终解决方案是恢复到现在已弃用的JSON::Syck,这正是我想要的。这是逻辑非 Moose 序列化为 JSON 的快速非 Moose 示例。

use JSON::Syck;
use URI;
use feature ':5.10';
say JSON::Syck::Dump(
 bless { foo => URI->new("http://www.evancarroll.com") }
)

我写了关于JSON::XS的作者,他不是添加功能的游戏。以下是JSON::XS 维护者Marc Lehmann的一些文本(从大量消息中摘录以说明为什么没有此功能) :

不,因为您使用的是JSON而不是Perl。Perl 显然能够表示任何 Perl 数据结构,但 JSON 不能,因此您需要告诉它要做什么。许多人天真地要求“只转储数据结构”之类的东西,但 JSON 甚至不能代表所有非对象的 perl 数据结构。

...

您的问题是:为什么我不能将这个 1MB 的 jpeg 图像作为 ascii 文件发送 - 仅仅是因为 ascii 不能代表八位字节。

...

或者,也许您只是想向它扔一些垃圾并期望 JSON::XS 做对您有好处的事情(但对其他人来说是错误的) - JSON::XS 根本无法神奇地猜测想要什么。

...

TO_JSON 就是它。其他任何事情都只是疯狂的猜测。

...

那么也许你应该尝试 JSON 可以实际表示的东西。向它抛出一些对象层次结构并希望它会做“正确的事情”显然是糟糕的软件工程 - 尽量不要使用黑客攻击,当你的协议需要 JSON,然后发送 JSON,不要指望 json 库修复你的无效消息放在首位。

我不知道如何回应,除了我不关心。只是工作!喜欢 ::SYCK。我不希望对象完美地转换为 JSON。但是,我认为我属于只希望它工作的 80%。我正在使用 JSON 进行 jQuery 导入,而不是在脑部手术期间执行银行交易。最终,我不想使用一个特殊的角色......我希望任何发送给它的东西都能神奇地为我转换到一个级别,使它在响应 jQuery JSON 请求时有用。

更新

抱歉,我错过了这些回复,直到有人说我在一个不相关的媒体中拖钓。MooseX::Storage 不适用于非 Moose 类,我想要一种以 JSON 格式表示存储的通用方法。不幸的是,其中一些成员是 Moose 对象。XML::Simple 可以做到这一点,Data::Dumper可以做到这一点,JSON::Syck 可以做到这一点,不胜枚举——我只想完成它。它不必与 Perl 是 1:1 的,老实说,我希望它的完成方式JSON::Syck与默认情况下的方式非常接近。那么我的论点是,“我如何才能JSON::XSJSON::Syck现在一样工作”?而且,你的答案是你不能。所以我没有采用不同的解决方案。写代码要花钱,我为什么要写to_JSON如果 Syck 已经做对了……我想说的是,反对者有责任展示 Syck 正在序列化一种不受欢迎的时尚。另外,请记住JSON::Syck是由Audry播种的,他绝不是巨魔、白痴或“脑残”;或者,我遇到的任何其他条款。我将以此结束:缺少错误的序列化路线JSON::Syck和所需的输出已经正常工作让我相信这对我来说是一个不错的选择。而且,MooseX::*:JSON 对任意 Moose 对象有何不同?为什么你认为不能编写代码来接受 Moose 对象而不是其上的方法?如果您不这么认为,请回答一些实质性的问题——我希望看到更好的回应。谢谢。(针对@jrockway 和@Ether)

于 2010-08-04T17:30:06.823 回答