use Syntax::Construct qw(\R); use File::Slurper qw(read_binary); use JSON::PP qw(); use Regexp::Common qw(delimited); my $bin = read_binary 'deperlorg-t20491-m188694.json'; { my @delim; # find quoted strings that contain unbackslashed whitespace # while also ignoring escaped quotes while ($bin =~ /$RE{delimited}{-delim=>'"'}{-keep}/cgms) { my $delimited = $1; push @delim, $delimited if $delimited =~ qr/\R|\t/; } for my $delimited (@delim) { substr $bin, (index $bin, $delimited), (length $delimited), # fix escapes ($delimited =~ s/\R/\\r\\n/gr =~ s/\t/\\t/gr); } } # ::PP skips // comments use DDS; Dump(JSON::PP->new->utf8->decode($bin)); __END__ { copyright => { description => 'Copyright und Rechte', message => "

All Rights reserved.
" . "\r\n\t\t\t\t\t(c)2013 Example Gmbh, Oxdorf" . "\r\n

" }, hello => { description => 'Greet the user', message => 'Hello, $USER$', placeholders => { user => { content => '$1', example => 'Cira' } } }, prompt_for_name => { description => 'Ask for the user\'s name', message => 'What\'s your name?' }, purpose => { description => "Funktionalit\344t der Anwendung", message => "Diese Anwendung erlaubt das Scannen nach Texten:" . "
\r\n\r\nWeiteres unter " . "Manual
\r\n" }, title => { description => 'Name der Anwendung', message => 'DoScan' }, version => 37 }