use strict; use warnings; use JSON::XS qw( decode_json ); use Scalar::Util qw( blessed reftype ); use XML::Simple qw( XMLout ); sub json_tree_to_xml_tree { for my $node (@_) { if (!defined($node)) { die("Can't handle undef\n"); } elsif (JSON::XS::is_bool($node)) { # true => 1 # false => 0 $node += 0; } elsif (blessed($node)) { die("Can't handle objects\n"); } elsif (reftype($node)) { if (ref($node) eq 'ARRAY') { json_tree_to_xml_tree( @$node ); } elsif (ref($node) eq 'HASH') { json_tree_to_xml_tree( values(%$node) ); } else { die("Unexpected reference type\n"); } } } } my $text = '{"a":"x","b":true}'; my $tree = decode_json($text); json_tree_to_xml_tree($tree); print XMLout($tree);