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 { my @to_visit = \( $_[0] ); while (@to_visit) { for my $node (${ pop @to_visit }) { 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') { push @to_visit, map \$_, @$node; } elsif (ref($node) eq 'HASH') { push @to_visit, map \$_, 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);