2009-06-22 6 views
0

Il existe des valeurs booléennes dans la structure de données JSON que j'utilise. Lorsque vous appelez decode_json pour le convertir en une structure de données Perl et alimenter la fonction XMLout fournie par XML::Simple, il génère une erreur car XMLout ne sait pas comment traiter les valeurs JSON::XS::Boolean.Comment puis-je convertir des valeurs booléennes JSON pour la sortie en utilisant XMLout?

Existe-t-il un moyen de convertir les valeurs JSON::XS::Boolean dans une structure de données en XML?

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

Dans le abive de code, je reçois l'erreur suivante - Impossible de coder une valeur de type: JSON :: XS :: Boolean

A print Dumper $result donne:

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

Votre question n'est pas à propos de JSON mais il s'agit de savoir comment obtenir XML :: Simple pour reconnaître la valeur booléenne JSON et l'encoder dans sa sortie. Vous devriez réécrire cette question pour que ce soit logique car je ne pense pas que je devrais y aller et changer tout cela. Aussi, n'avez-vous pas entendu parler de guillemets simples en Perl? my $ text = '{"a": "x", "b": true}'; Pourquoi est-ce difficile pour les autres de lire votre code? –

Répondre

5

Je demande au same question on PerlMonks et suis reproduisaient la solution proposée ci-dessous.

Fondamentalement, la solution est de changer la valeur de JSON :: XS :: Boolean à une valeur appropriée avant de passer à XMLEnDehors:

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

Sortie:

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

Notez que vous n'avez pas besoin de 'each', seulement' values'. –

+2

Je changerais la condition pour ne pas compter sur un détail d'implémentation. Utilisez JSON :: is_bool ($ scalar) à la place. –

0

Modifier: J'ai écrit cette réponse avant toutes les modifications apportées à la question d'origine. La question comme indiqué maintenant est que l'affiche originale veut créer une structure prête pour le XML à utiliser avec XML :: Simple; à l'origine, il semblait qu'il voulait juste mettre la structure JSON dans un nœud de texte.

Les objets Perl doivent être codés en JSON avant de les envoyer via le réseau.

De votre exemple:

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

Vous obtenez ce qui suit:

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

Et que pensez-vous qu'il obtiendra quand il passera cette sortie à XML :: Simple :: XMLout? – innaM

Questions connexes