我希望JSON:XS
在一行上输出数组元素。例如:
use warnings;
use strict;
use JSON::XS;
my $h={a=>[1,2,3,4],b=>3};
my $coder = JSON::XS->new->pretty;
my $txt = $coder->encode($h);
print $txt;
这给出了输出:
{
"b" : 3,
"a" : [
1,
2,
3,
4
]
}
而我想要的输出是:
{
"b" : 3,
"a" : [ 1, 2, 3, 4 ]
}
答案 0 :(得分:2)
此行为在模块中是硬编码的。如果您可以在计算机上修补模块代码,则可以轻松完成(以下说明适用于Linux CPAN):
/root/.cpan/build/JSON-XS-3.01-*
(实际名称末尾有一些随机字符)XS.xs
:--- XS.xs.orig 2014-11-08 14:22:37.682348401 +0300
+++ XS.xs 2014-11-08 14:30:01.447643990 +0300
@@ -486,6 +486,15 @@
encode_space (enc);
}
+INLINE void
+encode_comma_singleline (enc_t *enc)
+{
+ encode_ch (enc, ',');
+
+ if (enc->json.flags & F_SPACE_AFTER)
+ encode_space (enc);
+}
+
static void encode_sv (enc_t *enc, SV *sv);
static void
@@ -500,24 +509,18 @@
if (len >= 0)
{
- encode_nl (enc); ++enc->indent;
-
for (i = 0; i <= len; ++i)
{
SV **svp = av_fetch (av, i, 0);
- encode_indent (enc);
-
if (svp)
encode_sv (enc, *svp);
else
encode_str (enc, "null", 4, 0);
if (i < len)
- encode_comma (enc);
+ encode_comma_singleline (enc);
}
-
- encode_nl (enc); --enc->indent; encode_indent (enc);
}
encode_ch (enc, ']');
运行make
,然后make install
。
检查您的脚本:
$ perl json.pl
{
"a" : [1, 2, 3, 4],
"b" : 3
}
一些必需的免责声明:接受在本地更改模块需要您自担风险,正确的方法当然是制作一个接受相应配置选项的好补丁,并将此补丁提交给模块的作者。但是如果你只需要在计算机上运行它,那就完全可以了。
答案 1 :(得分:0)
如果数组不能包含哈希值,则可以解决以下问题:
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 )
; #strip leading and trailing brackets
$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 ]
}