我应该使用YAML还是JSON来存储我的Perl数据?

在过去6个月左右,我一直使用YAML格式取得合理成功。

然而,YAMLparsing器的纯粹的Perl实现是相当烦琐的手写一个可读的文件,并有(在我看来)恼人的怪癖,如在文件的末尾需要一个换行符。 与我的其他程序相比,速度也非常慢。

我正在思考我的项目的下一个发展,我正在考虑使用JSON(YAML的一个最严格的子集,事实certificate)。 但是哪种格式在Perl中最具社区吸引力和努力?

这对于Perl,YAML或JSON中的简单数据描述来说,今天看来是更好的长期格式,为什么呢?

YAML和JSON在Perl中是非常不稳定的,我承认我倾向于在这个过程中。 我会build议要么让你获得尽可能多的社区支持。 我会根据各种格式的利弊做出决定。 我打破了像这样的各种数据序列化选项(我要去社区维基,这样人们可以添加到它):

YAML赞成

  • 人类友好,人们甚至不知道它写基本的YAML
  • 所见即所得的string
  • performance力(它具有TMTOWDI本质)
  • 可扩展的types/元数据系统
  • Perl兼容的数据types
  • 手提
  • 熟悉(很多内联和string语法看起来像Perl代码)
  • 好的实现,如果你有一个编译器(YAML :: XS)
  • 很好的转储Perl数据的能力
  • 紧凑地使用屏幕空间(可能,您可以格式化为一行)

YAML缺点

  • 大规格
  • 不可靠/不完整的纯Perl实现
  • 空格作为语法可能是有争议的。

JSON优点

  • 人类可读/可写
  • 小规格
  • 好的实现
  • 手提
  • Perlish语法
  • YAML 1.2是JSON的超集
  • 紧凑地使用屏幕空间
  • Perl友好的数据types
  • 很多事情处理JSON

JSON缺点

  • string不是所见即所得
  • 没有可扩展性
  • 一些Perl结构必须被特别表示(对象和球体)
  • 缺乏可expression性

XML优点

  • 广泛使用
  • Web开发人员熟悉的语法
  • 很好的XML模块的大型语料库
  • 架构
  • search和转换数据的技术
  • 手提

XML缺点

  • 人类阅读和写作的乏味
  • Perl的外部数据结构
  • 缺乏可expression性
  • 大规格
  • 详细

Perl / Data :: Dumper Pros

  • 没有依赖关系
  • 令人惊讶的紧凑(与正确的标志)
  • Perl友好
  • 可以转储任何东西(通过DDS )
  • performance的
  • 紧凑地使用屏幕空间
  • 所见即所得的string

Perl / Data :: Dumper Cons

  • 非便携式(对其他语言)
  • 不安全(没有英雄的措施)
  • 不懂Perl的程序员

可储存的优点

  • 紧凑? (没有数字来备份)
  • 快速? (没有数字来备份)

可存储的缺点

  • 人类敌对
  • 跨可存储版本不兼容
  • 非便携式(对其他语言)

与大多数事情一样, 这取决于 。 我想如果你想要速度和互操作性(与其他语言),使用JSON,特别是JSON :: XS 。

如果你想要一些Perl模块将要使用的东西,可以使用YAML。 在CPAN上查找支持YAML的数据描述或者依赖于YAML的数据描述比JSON更常见。

请注意,我不是一个权威,这个意见主要是基于预感和猜想。 特别是,我没有分析JSON :: XS与YAML :: XS 。 如果我在进攻方面无知,我只能希望我能够让一个人感到愤慨,通过纠正我来为讨论提供有用的信息。

这是关于人的可读性,如果这是你主要关心的selectYAML:

YAML:

 american: - Boston Red Sox - Detroit Tigers - New York Yankees national: - New York Mets - Chicago Cubs - Atlanta Braves 

JSON:

 { "american": [ "Boston Red Sox", "Detroit Tigers", "New York Yankees" ], "national": [ "New York Mets", "Chicago Cubs", "Atlanta Braves" ] } 

纯Perl的YAML实现(与YAML::Syck相对的YAML模块)似乎有一些严重的问题。 最近我遇到了一些问题,无法处理YAML文件的行数很长(32K字符左右)。

YAML能够存储和加载有福的variables,默认情况下是这样(下面的代码片段是从Emacs的*sepia-repl*缓冲区中复制的):

 I need user feedback! Please send questions or comments to seano@cpan.org. Sepia version 0.98. Type ",h" for help, or ",q" to quit. main @> use YAML undef main @> $foo = bless {}, 'asdf' bless( {}, 'asdf' ) main @> $foo_dump = YAML::Dump $foo '--- !!perl/hash:asdf {} ' main @> YAML::Load $foo_dump bless( {}, 'asdf' ) 

这是非常可怕的安全方式,因为不可信的数据可以用来调用应用程序中定义的任何DESTROY方法 – 或者它使用的任何模块。

以下简短的程序演示了这个问题:

 #!/usr/bin/perl use YAML; use Data::Dumper; package My::Namespace; sub DESTROY { print Data::Dumper::Dumper \@_; } package main; my $var = YAML::Load '--- !!perl/hash:My::Namespace bar: 2 foo: 1 '; 

JSON默认不允许这样做 – 可以序列化Perl“对象”,但是为了做到这一点,必须定义TO_JSON方法。

如果您正在考虑JavaScript对象表示法,为什么不使用“Perl对象表示法”?

JSON:

 {"name": "bob", "parents": {"mother": "susan", "father": "bill"}, "nums": [1, 2, 3]} 

Perl的:

 {name => "bob", parents => {mother => "susan", father => "bill"}, nums => [1, 2, 3]} 

你也可以考虑使用Storable 。 你可能会得到一个非常好的速度提升。 取舍是:

  • 可存储格式是二进制的,不像JSON或YAML那样是人类可读的
  • 可存储不是纯粹的Perl模块(如果这很重要)

我使用YAML来跟踪进程的状态,因为我可以在进程中读取YML。 您(技术上)需要完整的文档来读取XML或JS。 YAML很适合跟踪状态,因为您可以将大量的迷你文档写入文件。 否则,我通常使用XML或JS。 好的利弊总结以上,顺便说一句。