如果数组不能包含散列,则可以采用以下解决方法:
use warnings;
use strict;
use JSON::XS;
use Text::Balanced qw(extract_bracketed extract_delimited);
use Text::CSV;
my $csv = Text::CSV->new( { sep_char => ',', allow_whitespace => 1 } );
my $h = { a => "[", g => [ "[", 2, "bb]]", 4 ], b => 3, c => [ 1, 2, 3, 4 ] };
my $coder = JSON::XS->new->pretty;
my $txt = $coder->encode($h);
my $str = "";
while (1) {
my $ind1 = index( $txt, '"' );
my $ind2 = index( $txt, '[' );
if ( $ind1 >= 0 && $ind2 >= 0 ) {
if ( $ind1 < $ind2 ) {
skipQuoted( \$txt, \$str );
next;
}
}
elsif ( $ind2 < 0 ) {
$str .= $txt;
last;
}
my ( $etxt, $end, $beg ) = extract_bracketed( $txt, '["]', '[^[]*' );
die "Unexpected!" if !defined $etxt;
$str .= $beg;
$etxt = substr( $etxt, 1, length($etxt) - 2 )
;
$etxt =~ s{\n}{}g;
my @elem;
if ( $csv->parse($etxt) ) {
@elem = $csv->fields();
}
else {
die "Unexpected!";
}
$str .= '[ ' . processFields( \@elem ) . ' ]';
$txt = $end;
}
print $str;
sub skipQuoted {
my ( $txt, $str ) = @_;
my ( $s1, $s2, $s3 ) = extract_delimited( $$txt, '"', '[^"]*' );
die "Unexpected!" if !defined $s1;
$$str .= $s3 . $s1;
$$txt = $s2;
}
sub processFields {
my ($a) = @_;
for (@$a) {
if ( $_ !~ /^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/ ) {
$_ = '"' . $_ . '"';
}
}
return join( ", ", @$a );
}
输出:
{
"a" : "[",
"g" : [ "[", 2, "bb]]", 4 ],
"b" : 3,
"c" : [ 1, 2, 3, 4 ]
}
XS.xs
文件。此外,其他人(在其他机器上)将使用此程序,因此我认为修改本地源不是一个选项...最好向模块的作者提交补丁。无论如何,还是谢谢! - Håkon Hæglandrpm -e perl-JSON-XS
或类似命令,根据你的系统而定),然后使用CPAN进行安装:perl -MCPAN -e 'install JSON::XS'
。你将会有一个build
目录,其中包含模块源代码,包括XS.xs
文件。 - afenstercpanm JSON::XS
安装它(几个月前)。我正在使用 Perl 版本 5.18.2,在 Ubuntu 14.04 上。 - Håkon HæglandTerm::ReadKey::GetTerminalSize()
,则应该插入一个新行,并在上一行的[
位置处开始缩进继续下一行的数组。 - Håkon Hægland