【问题标题】:What's the difference between these JSON Perl modules?这些 JSON Perl 模块之间有什么区别?
【发布时间】:2016-12-11 11:01:06
【问题描述】:

下面的 Perl JSON 模块有什么区别?

我遇到过JSON::PPJSON::XSJSON::PP 的文档说它与 JSON::XS 兼容。这是什么意思?

我不确定它们之间有什么区别,更不用说使用哪一个了。有人可以澄清一下吗?

【问题讨论】:

  • 在这种情况下兼容意味着两个模块给出相同的结果并具有相同的函数名称。底层实现虽然不同......

标签: json perl


【解决方案1】:

Perl 模块有时有不同的实现。 ::PP 后缀用于纯 Perl 实现(即可移植性),::XS 后缀用于基于 C 的实现(即速度),JSON 只是顶层模块本身(即你实际使用的)。

正如@Quentin 所说,this site 对它们有很好的描述。引用:

JSON

JSON.pm 是 JSON::PPJSON::XS 的包装器——出于兼容性原因,它还做了一些相当疯狂的事情,包括用于非常旧的 perls 的额外 shim 代码 [...]

JSON::PP

这是标准的纯 perl 实现,如果您不依赖性能,直接使用它没有任何问题 [...]

JSON::XS

用 C 语言实现的 JSON 速度快得离谱。绝对精彩 [...]

如您所见,只需安装顶级 JSON 模块即可为您完成。关于兼容性的部分只是意味着它们都做同样的事情,即你应该从两者获得相同的输出。

几年前,我在我管理的 RHEL 服务器上安装了 Perl JSON 模块,这是一个非常简单的过程:只需从 CPAN site 安装(或构建)模块,就完成了。

安装应该是使用操作系统包管理器(如果在 GNU/Linux 中)、使用 cpan 实用程序或从源代码构建的简单案例。推荐使用 OS 包管理器,因为它有助于自动更新内容。

要验证它是否已安装,只需从终端尝试以下命令(假设是 GNU/Linux):

$ perl -e 'use JSON;'

如果它没有抱怨,那么你应该很高兴。如果你遇到错误,那么你应该准备好去冒险了。

【讨论】:

  • 我更喜欢 perl -MJSON\ 999(带有反斜杠和空格),因为它给出了您拥有的版本,或者抱怨。
  • @simbabque:我希望这不是对我投反对票的解释?
  • 不,我觉得你的回答很好。我只是添加了其他信息。不要担心一个单一的反对票。只是有时有人认为答案没有用。每个人都可以按自己的意愿投票。不要因此而气馁。 :-)
  • @simbabque:不用担心。我想当你被告知你的答案“没用”但没有给出从反对者的角度来看为什么会出现这种情况的原因时,这并不是很好。有时这是很容易解决的问题。谢谢。
  • 大部分时间他们继续前进,永远不会看到您的评论。九个人认为这很有用。这很不错。 :-)
【解决方案2】:

可以安装JSON模块,cpan安装JSON

use JSON;

my $result = from_json($json);
if($result->{field})
{
  # YOUR CODE
};

【讨论】:

  • 那会回答这个问题吗?
  • @rustyx 我想是的。答案是“使用 JSON;” 那有什么问题?我自己按照 Jose 展示的方式使用它并且它有效。为什么投反对票?
  • 问题不是如何使用JSON?。问题是为什么会有各种不同的 JSON 模块。
  • OP 已经知道 JSON 模块的存在,从提出问题的方式来看,很明显他们知道如何使用它。虽然我同意你的例子很好,但我不认为你的一个函数的特定示例将有助于消除关于为什么存在纯 Perl 和 XS 实现以及为什么他们的文档说它们都兼容的混淆彼此。
  • 我没有投反对票,但这篇文章没有抓住重点。问题是应该使用所提供的所有选项中的哪个模块,所有这些选项的名称中都包含JSON。 OP 显然对包装器/实现的区别感到困惑。虽然您的示例可能是正确的,但它并没有解决问题。如前所述,问题不在于 如何 使用该模块,而在于 他遇到的哪个选项 应该是正确的,尤其是当有有几个JSON::* 可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2014-04-01
  • 2011-04-10
  • 1970-01-01
相关资源
最近更新 更多