在perl中将数组转换为json,获取字符串数组

时间:2013-07-30 22:20:11

标签: json perl

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


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

但我得到的输出是:

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:7)

来自JSON documentation


  

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

   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]}

这就是你想要的。正确?

我们将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]}

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

相关问题