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" } ] } }