2011-03-01 154 views
2

我有一些稱爲節點的結構,每個結構都有一個關於節點的幾個重要特性。我有一個包含一堆節點的圖形結構。本質上,我想遍歷所有節點並創建某種可以將每個節點轉換爲JSON元素的結構。對於每個節點,我都應該在JSON文件中包含一個具有所有功能(其名稱,代碼,羣體...所有屬性)的元素。需要幫助從Perl生成JSON

我似乎無法弄清楚如何使用JSON:XS ...

my $nodeHash = {}; # the hash I plan to pass to the to_json function 
my $metros = {}; #each metro is a Node with a bunch of features 
my @array=(); # an array that I populate with nodes 

    #some code to populate the array (these are blessed objects) 

$nodeHash->{$metros} = \@array; # metros has a reference to a list of all nodes 
my $json = new JSON; # this syntax is yielding an error for some reason 
$json = JSON->allow_blessed([$enable]); #im not sure quite how this works from the documentation 
my $json_string = $json->encode_json($nodeHash); 
open(JSON, ">output.json") or die "cannot open file for reading: $!"; 
    print JSON "$json_string"; 
+1

我不熟悉JSON:XS,但讓我發表幾條評論。 (1)你是否嘗試過'my $ json = new JSON :: XS;'而不是'my $ json = new JSON';(2)你的代碼包含語句'$ json = JSON-> allow_blessed([$ enable] );',但是你在哪裏設置'$ enable'(如果你沒有設置,它是'false')? – MarcoS 2011-03-01 08:16:10

+0

如果您需要將對象傳遞給json,則可以使用'to_json($ nodeHash,{allow_blessed => 1})''。但它可能不會做你想做的事情,因爲它將對象轉換爲null。對於任意表示,請查看'convert_blessed'選項,並在'Node'中提供'TO_JSON'方法。 – bvr 2011-03-01 09:04:46

+3

通常使用'[]'來表示一個可選參數。這與匿名數組構造函數無關。文檔說'allow_blessed'帶有一個可選參數,默認爲true。但是由於arrayref被認爲是一個真正的值,所以傳遞一個文字'[$ enable]'實際上可以工作以允許有福的對象。 – cjm 2011-03-01 10:21:00

回答

3

也許最簡單的是功能界面。 JSON根據安裝的內容從JSON::XSJSON::PP中選擇一個。

use JSON; 

my $node_hash = { 
    a => [ 'text1', 'text2' ], 
    b => [ 'what', 'is', 'this' ], 
}; 

print to_json($node_hash); # {"a":["text1","text2"],"b":["what","is","this"]}