4

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

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

但我得到的输出是:

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

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

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

谢谢!

4

3 回答 3

7

JSON文档中:


您可以通过 numifying 强制类型为数字:

   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;
于 2013-07-30T22:28:46.223 回答
1

除了较早的答案:这不是数据定义的问题,而是使用的问题。

JSON::XS 吊舱

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被编码为字符串?谨防!

(我了解到,只有在我激活了一些调试日志时才会出现这种情况。

于 2019-10-01T13:16:02.170 回答
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]}

那就是你想要的。对?

让我们将引号中的pushfrom更改push @array , $number;push @array "$number";where $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]}

看起来您必须为数组的每个元素添加一个零才能将字符串转换回数值。

于 2013-07-31T02:22:33.367 回答