【问题标题】:Perl YAML to JSONPerl YAML 到 JSON
【发布时间】:2014-10-27 07:47:39
【问题描述】:

我想要做的应该非常简单明了。

use JSON;
use YAML;
use Data::Dumper;

my $yaml_hash = YAML::LoadFile("data_file.yaml");
print ref($yaml_hash) # prints HASH as expected
print Dumper($yaml_hash) # correctly prints the hash
my $json_text = encode_json($yaml_hash);

encode_json 错误提示:

cannot encode reference to scalar 'SCALAR(0x100ab630)' unless the scalar is 0 or 1

我无法理解为什么 encode_json 认为 $yaml_hash 是对标量的引用,而实际上它是对 HASH 的引用

我做错了什么?

【问题讨论】:

  • 请注意,JSON 是 YAML 的 子集,如果数据仅使用 JSON 支持的功能,则无需转换。另一方面,如果数据确实使用了 YAML 特有的某些功能,则无法进行翻译。

标签: json perl yaml


【解决方案1】:

它抱怨的不是 $yaml_hash,它是哈希值之一(或更深)中的一些引用。标量引用可以用 YAML 表示,但不能用 JSON。

【讨论】:

  • 希望我能为您的回答 +1。我没有足够的声望。你是对的。
【解决方案2】:

YAML 使您能够加载对象和标量引用。 JSON 默认没有

我怀疑您的数据文件很可能包含一个由内而外的对象,而 JSON 不知道如何使用标量引用。

以下演示在其中一个值中加载包含标量引用的 YAML 哈希,然后无法使用 JSON 对其进行编码:

use strict;
use warnings;

use YAML;
use JSON;

# Load a YAML hash containing a scalar ref as a value.
my ($hashref) = Load(<<'END_YAML');
---
bar: !!perl/ref
  =: 17
foo: 1
END_YAML

use Data::Dump;
dd $hashref;

my $json_text = encode_json($hashref);

输出:

{ bar => \17, foo => 1 }
cannot encode reference to scalar at script.pl line 18.

【讨论】:

  • 水晶般清晰的答案!非常感谢。我的 YAML 确实有这样的标量引用。
【解决方案3】:

这是一种可用于将YAML 导入并在STDOUT 上产生JSON 的衬垫

perl -0777 -MYAML -MJSON -e 'print(JSON->new()->utf8()->pretty()->encode(Load(<STDIN>)))'

如果你不关心格式,甚至更短

perl -0777 -MYAML -MJSON -e 'print encode_json(Load(<STDIN>))'

对于大容量和更快的解析,我还建议使用 YAML::XSJSON::XS 对应项

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 2018-12-26
    • 2020-10-04
    • 2017-07-02
    • 2016-01-16
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多