我正在尝试将数组转换为json:
$json = to_json("numbers_array" => \@numbers_array); print $json;
但我得到的输出是:
{"numbers_array" => ["1","2","3"] }
我正在使用push()添加元素来构建数组。如何转换为json并保留数字类型,以便输出为:
{"numbers_array" => [1,2,3]}
谢谢!
答案 0 :(得分:7)
您可以通过编号强制类型为数字:
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 :(得分:1)
除了先前的答案之外:这不是数据的定义问题,而是使用情况的问题。
来自JSON::XS pod:
JSON :: XS将对在字符串上下文中最后使用过的[…]标量进行编码,然后再编码为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的艰辛方式只有在我有一些调试日志记录处于活动状态时才会出现。)
答案 2 :(得分: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]}
这就是你想要的。正确?
我们将push
从push @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]}
看起来你必须为数组的每个元素添加一个零,以将字符串转换回数值。