将Perl中的数字数组转换为JSON,获取字符串数组

4
我正在尝试将数字数组转换为json:

   $json = to_json("numbers_array" => \@numbers_array);
   print $json;

但我得到的输出是:

  {"numbers_array" => ["1","2","3"] }

我是通过使用 push() 添加元素来构建该数组的。如何转换为json并保留数字类型,以便输出为:

  {"numbers_array" => [1,2,3]}

谢谢!

3个回答

7

来自JSON文档


你可以将其转换为数字类型,强制类型为数字:

   my $x = "3"; # some variable containing a string
   $x += 0;     # numify it, ensuring it will be dumped as a number
   $x *= 1;     # same thing, the choice is yours.

我会尝试做出如下改动:

我会试着按照以下方式操作:

    $json = to_json({numbers_array => [map { $_ + 0 } @numbers_array]});
    print $json;

1
除了前面的回答之外:这不是关于您数据的定义,而是关于用法的问题。
JSON::XS pod中可以看到:

JSON::XS将编码[...]在编码为JSON字符串之前最后被用于字符串上下文中的标量作为JSON字符串,其他所有内容都作为数字值。

考虑下面的代码片段:
use JSON::XS;
my $numbers = [123,124,125];
print "A number: $numbers->[1]\n";            #<- use 2nd entry in string context.
print JSON::XS->new->encode ($numbers)."\n";

它打印:

A number: 124
[123,"124",125]

你是否希望看到数字124作为字符串进行编码? 小心! (在我开启了一些调试日志后,我曾通过艰难的方式学习到这一点,追踪heisenbug问题才浮出水面。)

0

这是我的程序:

#! /usr/bin/env perl

use strict;
use warnings;
use feature qw(say);

use JSON;

my @array;
for my $number ( (1..5) ) {
    push @array, $number;
}
say to_json( {"number_array" => \@array} );

这是我的结果:

{"number_array":[1,2,3,4,5]}

这就是你想要的,对吧?

让我们将我的pushpush @array , $number;更改为push @array "$number";,其中$number被引号括起来,就像它是一个字符串一样:

#! /usr/bin/env perl

use strict;
use warnings;
use feature qw(say);

use JSON;

my @array;
for my $number ( (1..5) ) {
    push @array, "$number";
}
say to_json( {"number_array" => \@array} );

现在我得到:

{"number_array":["1","2","3","4","5"]}

一些奇妙的事情,JSON 能够检测到这些“数字”被推送为字符串。让我再次循环,并向每个元素添加一个零:
#! /usr/bin/env perl

use strict;
use warnings;
use feature qw(say);

use JSON;

my @array;
for my $number ( (1..5) ) {
    push @array, "$number";
}

@array  = map { $_ += 0 } @array; #Add a 0 to each element

say to_json( {"number_array" => \@array} );

返回:

{"number_array":[1,2,3,4,5]}

看起来你需要将数组中的每个元素加零,以将字符串转换回数字值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接