对于 JSON 操作,您会推荐哪个 Perl 模块?
Posted
技术标签:
【中文标题】对于 JSON 操作,您会推荐哪个 Perl 模块?【英文标题】:Which Perl module would you recommend for JSON manipulation? 【发布时间】:2013-01-13 12:39:32 【问题描述】:像往常一样,我很高兴与 CPAN 打交道,因为它满足了我们的所有需求。像往常一样,我迷路了,因为有很多东西。
我自己可以找到核心JSON
一个,一个JSON::Tiny
其他的感觉很热情。
我的需求非常简单(从Open Library API 解析内容),也许有一天,我们会公开我们自己的数据。
对于这项任务,您还有其他喜欢的模块吗?
【问题讨论】:
JSON::Tiny 的用例是您需要一个轻量级的 JSON 实现并且不需要像 XS 那样的编译器的情况。它也适合捆绑。如果你需要一个纯 Perl JSON 包,它适合你。如果你买得起 XS 工具链,JSON::XS 会更快。 感谢@DavidO 的精确,我终于使用了 JSON::XS,它非常好用且简单易用。 Cpanel::JSON::XS 是最快和最新的 请参阅比较 JSON 解码器的速度一文perlmaven.com/comparing-the-speed-of-json-decoders @szagab 您提供的 URL 实际上并没有说它是最快的。此外,Cpanel 分支不包含任何修复,只有一些可能会在以后咬你的肮脏黑客。 【参考方案1】:JSON 模块像冠军一样工作,但如果您需要更快的解析器,请使用这个:JSON::XS,它需要原生编译。
请注意,JSON 2.0 及更高版本只是 JSON::XS(如果已安装)或 JSON::PP(后备)的前端。
【讨论】:
如果两者都安装,JSON 将默认使用 JSON::XS。 @Sebf,如果您认为它太快,请随时添加对sleep
的调用。
25 年的业务经验说 JSON。 24 岁的脚本小子可能会说“JSON::XS”——不要听他们的。
“我是不是就这么脱节了?不,错的是孩子们。” - 西摩斯金纳
请注意JSON::PP
是当今的核心模块。【参考方案2】:
[更新:我现在推荐 Cpanel::JSON::XS 而不是 JSON::XS。 Cpanel::JSON::XS 是 JSON::XS 的更好维护版本。]
我总是使用JSON::XS。完整、强大、经过验证、快速*、易于使用,如果您需要,还可以提供一点灵活性。
它可能是最常用的 JSON 解析器,尽管大多数人通过 JSON 访问它(但这样做有可能改用较慢的 JSON::PP)。
* — 根据JSON::Tiny 的文档,比 JSON::Tiny 快“一个数量级”。
【讨论】:
如果您遇到 JSON::XS 中的众多错误之一,您可能希望回退到 Cpanel::JSON::XS,它已修复它们。或者使用 JSON::Any 或 JSON::MaybeXS,它们会选择最好的。 将 JSON::XS 称为“积极维护”可能是一个很长的尝试,而且您可能非常孤单。他拒绝使用 bugtracker,因为“RT 很烂”,所以你看不到其他人报告的错误,我必须为我们的 fork 修复这些错误。由于非技术原因,这些错误中的大多数都被忽略了。 RT 很烂,是的,我同意,所以我使用了更好的跟踪器。但这不是忽略大多数错误报告的借口。 @rurban,我在想 Text::CSV_XS。我不知道 JSON::XS 的维护历史。 JSON::XS 的作者确实是个让人头疼的问题。 (例如,他拒绝使用 CPAN-RT,但没有在 META 文件中提供另一种报告方式,因此 CPAN 说要使用 CPAN-RT...) JSON::XS 显然得到了积极的维护。 @rurban:您应该停止传播 FUD,并且可能会稍微降低您的 cpanel 模块的积极性,因为它主要是肮脏的黑客攻击。【参考方案3】:既然您说您从在线来源获取数据,您可能会考虑使用Mojolicious 工具套件。通过这种方式,您可以get the data、parse it 甚至可以使用JSON pointers 来提取信息。
基本:
#!/usr/bin/env perl
use strict;
use warnings;
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
my $data = $ua->get('http://openlibrary.org/search.json?title=perl%20modules')
->res
->json;
使用 url 构造函数和 JSON 指针:
#!/usr/bin/env perl
use strict;
use warnings;
use v5.10;
use Mojo::URL;
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
my $url = Mojo::URL->new('http://openlibrary.org/search.json')
->query( title => 'perl modules' );
say $ua->get($url)
->res
->json('/docs/0/title_suggest');
请注意,响应对象上的json
方法要么返回整个已解析的数据结构,要么可以采用指针字符串(如第二个示例中所示)仅返回一个子集以使您快速进行。享受吧。
【讨论】:
看起来非常有趣且易于使用。我没有提到我们使用的是 Catalyst,但据我所知,它们并不等同。 Mojolicious 实际上是由 Catalyst 的作者编写的,最初是作为它的替代品。现在人们普遍认为这两者是不同的项目。许多人会声称在 Catalyst 项目中使用 Mojolicious 很愚蠢,但由于它很轻,我个人认为没有理由不这样做。 :-)【参考方案4】:我会推荐JSON::MaybeXS - 使用 Cpanel::JSON::XS 并回退到 JSON::XS 和 JSON::PP。
Cpanel::JSON::XS 在 JSON::XS 上具有 improvements,因此 JSON::MaybeXS 使您的代码美观且可移植。
如果我不确定在特定情况下使用哪个模块,通常我会查看 Task::Kensho,虽然他们目前没有 JSON,但我已经向他们报告了!
【讨论】:
很高兴您向 Task::Kensho 报告!由于有一些关于 XML 的模块,JSON 似乎也很重要。 Task::Kensho 由github 管理,以票证(或更好的拉取请求!)的形式提出建议总是受欢迎的。 TK 中的所有内容都经过基于#epo-ec
和irc.perl.org
的讨论和审查过程。【参考方案5】:
我一有机会就开始使用Mojo::JSON。 Mojolicious 易于安装,正如Joel Berger 在his answer 中显示的那样,它提供了更多功能。
【讨论】:
【参考方案6】:JSON::XS 会是一个不错的模块。
【讨论】:
以上是关于对于 JSON 操作,您会推荐哪个 Perl 模块?的主要内容,如果未能解决你的问题,请参考以下文章