2014-09-02 73 views
3

我想要做的事情应该非常简单直接。Perl YAML到JSON

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是标量的参考,而实际上它是一个散列的引用

我做错了什么?

+2

注意,JSON是一种* YAML的子集*,如果数据仅使用JSON支持的功能,则不需要翻译。另一方面,如果数据确实使用了YAML专用的一些功能,那么翻译是不可能的。 – Borodin 2014-09-02 23:59:00

回答

4

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. 
+0

晶莹剔透的答案!非常感谢。我的YAML确实有这样一个标量参考。 – shikhanshu 2014-09-04 05:50:35

4

它不是$ yaml_hash它抱怨,它是一个散列值(或更深)中的某个参考。标量引用可以用YAML表示,但不能用JSON表示。

+0

希望我能+1你的答案。我没有足够的声望。你是对的。 – shikhanshu 2014-09-04 05:53:06