2009-06-22 6 views
0

Es gibt boolesche Werte in der JSON-Datenstruktur, die ich verwende. Wenn Sie decode_json aufrufen, um es in eine Perl-Datenstruktur zu konvertieren und an die XMLout-Funktion von XML::Simple zu senden, wird ein Fehler ausgegeben, weil XMLout nicht weiß, wie mit JSON::XS::Boolean Werten umzugehen ist.Wie kann ich boolesche JSON-Werte für die Ausgabe mit XMLout konvertieren?

Gibt es eine Möglichkeit, die JSON::XS::Boolean Werte in einer Datenstruktur in XML zu konvertieren?

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

Im Code abive, erhalte ich die folgenden Fehler - kann keinen Wert vom Typ kodieren: JSON :: XS :: Boolean

A print Dumper $result gibt:

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

Ihre Frage ist nicht über JSON, aber es geht darum, wie XML :: Simple den booleschen JSON-Wert erkennt und in seiner Ausgabe codiert. Du solltest diese Frage neu schreiben, damit es Sinn macht, weil ich nicht denke, dass ich reingehen und das Ganze ändern sollte. Haben Sie in Perl auch nicht von einfachen Anführungszeichen gehört? my $ text = '{"ein": "x", "b": wahr}'; Warum sollten andere Ihren Code nicht lesen können? –

Antwort

5

ich die same question on PerlMonks gefragt und bin die vorgeschlagene Lösung unter reproduzieren.

Grundsätzlich ist die Lösung, die den Wert von JSON :: XS :: Boolean auf einen geeigneten Wert zu ändern, bevor es zu XMLout vorbei:

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); 

Ausgang:

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

Beachten Sie, dass Sie nicht "jedes", sondern nur "Werte" benötigen. –

+2

Ich würde die Bedingung ändern, um nicht auf ein Implementierungsdetail zu vertrauen. Verwenden Sie stattdessen JSON :: is_bool ($ scalar). –

0

Bearbeiten: Ich schrieb diese Antwort vor allen Änderungen an der ursprünglichen Frage. Die Frage lautet nun, dass das ursprüngliche Poster eine XML-fähige Struktur für die Verwendung mit XML :: Simple erstellen möchte; Ursprünglich wollte er die JSON-Struktur einfach in einen Textknoten einfügen.

Perl-Objekte müssen JSON-codiert werden, bevor sie über die Leitung gesendet werden.

Von Ihrem Beispiel:

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

Sie erhalten die folgenden:

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

Und was denkst du wird er bekommen, wenn er diese Ausgabe an XML :: Simple :: XMLout übergibt? – innaM

Verwandte Themen