Perl YAML到JSON

Perl YAML到JSON,json,perl,yaml,Json,Perl,Yaml,我想做的应该是非常简单明了的 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); enc

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

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_散列是对标量的引用,而实际上它是对散列的引用


我做错了什么?

它抱怨的不是$yaml_散列,而是其中一个散列值(或更深层次)中的某个引用。标量引用可以用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);

下面是一个可用于在中导入
YAML
并在
STDOUT

perl -0777 -MYAML -MJSON -e 'print(JSON->new()->utf8()->pretty()->encode(Load(<STDIN>)))'
perl-0777-MYAML-MJSON-e'print(JSON->new()->utf8()->pretty()->encode(Load())'
如果你不喜欢格式化,甚至更短

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

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

注意,JSON是YAML的一个子集,如果数据仅使用JSON支持的功能,则无需翻译。另一方面,如果数据确实使用了YAML特有的一些特性,那么翻译是不可能的。答案非常清楚!谢谢。我的YAML确实有这样一个标量引用。希望我能+1你的答案。我没有足够的声誉。你是对的。
perl -0777 -MYAML -MJSON -e 'print encode_json(Load(<STDIN>))'