sub flattened_json {
my ($cur_node, $top_path, $put_here) = @_;
$top_path //= [];
$put_here //= {};
if (ref $cur_node eq "HASH") {
flattened_json($$cur_node{$_}, [ @$top_path, $_ ], $put_here)
for sort keys %$cur_node;
} elsif (ref $cur_node eq "ARRAY") {
flattened_json($$cur_node[$_], [ @$top_path, $_ ], $put_here)
for 0 .. @$cur_node - 1;
} else {
$$put_here{
join " ➔ ",
map { $json_do->pretty(0)->encode($_) =~ s/➔/➔➔/gr }
@$top_path
} = $json_do->pretty(0)->encode($cur_node) =~ s/➔/➔➔/gr;
}
return $put_here;
}
####
#!/usr/bin/perl -CSDA
use utf8;
use Modern::Perl qw{2017};
use JSON;
use Text::Unidecode;
require "./narzędzia";
my $f = flattened_json(JSON->new->relaxed->decode(do { local $/; }));
print "$_ ➔ $$f{$_}\n" for
sort {
lc(unidecode($a =~ s/ ➔ ([0-9]+)/sprintf " ➔ %09d", $1/ger))
cmp
lc(unidecode($b =~ s/ ➔ ([0-9]+)/sprintf " ➔ %09d", $1/ger))
}
keys %$f;
####
#!/usr/bin/perl -CSDA
use utf8;
use Modern::Perl qw{2017};
use JSON;
use Text::Unidecode;
require "./narzędzia";
my $f = flattened_json(JSON->new->relaxed->decode(do { local $/; }));
print "$_ ➔ $$f{$_}\n" for
sort {
lc(unidecode($a =~ s/ ➔ ([0-9]+)/sprintf " ➔ %09d", $1/ger))
cmp
lc(unidecode($b =~ s/ ➔ ([0-9]+)/sprintf " ➔ %09d", $1/ger))
}
keys %$f;
####
# cat json.txt
{
"menu" : {
"header" : "SVG Viewer",
"items" : [
{
"id" : "Open"
},
{
"id" : "OpenNew",
"label" : "Open New"
},
null,
{
"id" : "ZoomIn",
"label" : "Zoom In"
},
{
"id" : "OriginalView",
"label" : "Original View"
}
]
}
}
# cat json.txt | ./json_to_paths
"menu" ➔ "header" ➔ "SVG Viewer"
"menu" ➔ "items" ➔ 0 ➔ "id" ➔ "Open"
"menu" ➔ "items" ➔ 1 ➔ "id" ➔ "OpenNew"
"menu" ➔ "items" ➔ 1 ➔ "label" ➔ "Open New"
"menu" ➔ "items" ➔ 2 ➔ null
"menu" ➔ "items" ➔ 3 ➔ "id" ➔ "ZoomIn"
"menu" ➔ "items" ➔ 3 ➔ "label" ➔ "Zoom In"
"menu" ➔ "items" ➔ 4 ➔ "id" ➔ "OriginalView"
"menu" ➔ "items" ➔ 4 ➔ "label" ➔ "Original View"
# cat json.txt | ./json_to_paths | ./paths_to_json
{
"menu" : {
"header" : "SVG Viewer",
"items" : [
{
"id" : "Open"
},
{
"id" : "OpenNew",
"label" : "Open New"
},
null,
{
"id" : "ZoomIn",
"label" : "Zoom In"
},
{
"id" : "OriginalView",
"label" : "Original View"
}
]
}
}