2009-06-22 31 views
0

我正在使用的JSON數據結構中有布爾值。當調用decode_json將其轉換爲Perl數據結構並提供給XML::Simple提供的XMLout函數時,它會拋出錯誤,因爲XMLout不知道如何處理JSON::XS::Boolean值。如何使用XMLout轉換輸出的JSON布爾值?

有沒有辦法將數據結構中的JSON::XS::Boolean值轉換爲XML?

my $text = '{"a":"x","b":true}'; 
my $result = decode_json($text); 
my $rec = XMLout($result, RootName => 'root', SuppressEmpty => 1); 

在代碼abive,我碰到下面的錯誤 - 不能編碼類型的值:JSON :: XS ::布爾

一個print Dumper $result給出:

$result = { 
     'a' => 'x', 
     'b' => bless(do{\(my $o = 1)}, 'JSON::XS::Boolean') 
     }; 
+1

你的問題是不關於JSON,但它是關於如何獲取XML :: Simple來識別JSON布爾值並將其編碼到其輸出中。你應該重新寫這個問題,所以它是有道理的,因爲我不認爲我應該進去改變整個事情。另外,你有沒有聽說過Perl中的單引號?我的$ text ='{「a」:「x」,「b」:true}';爲什麼讓別人難以閱讀你的代碼? – 2009-06-22 14:59:09

回答

5

我問same question on PerlMonks和我重現低於建議的解決方案。

基本上,該解決方案是將它傳遞給XMLout之前JSON :: XS ::布爾值改變爲適當的值:

use strict; 
use warnings; 

use JSON; 
use XML::Simple; 

my $text = '{"a":"x","b":true}'; 
my $result = decode_json($text); 

for my $value (values %$result) { 
    next unless 'JSON::XS::Boolean' eq ref $value; 
    $value = ($value ? 'true' : 'false'); 
} 

print XMLout($result, RootName => 'root', SuppressEmpty => 1); 

輸出:

C:\Temp> test.pl 
<root a="x" b="true" /> 
+0

請注意,您不需要「每個」,只需要「值」。 – 2009-06-22 19:21:17

0

編輯:我在對所有原始問題進行編輯之前編寫了這個答案。現在提出的問題是,原始海報想要創建一個XML-ready結構,以便使用XML :: Simple;最初說,似乎他只是想把JSON結構放在文本節點中。

Perl對象在通過電線發送之前需要先進行JSON編碼。

從你的例子:

my $text = '{"a":"x","b":true}'; 
my $result = decode_json($text); 
print JSON->new->utf8->pretty(1)->encode($result); 

你得到如下:

$ perl json.pl 
{ 
    "a" : "x", 
    "b" : true 
} 
+2

當他將該輸出傳遞給XML :: Simple :: XMLout時,他認爲他會得到什麼? – innaM 2009-06-22 16:21:10