为什么我手工创建的 JSON 无法识别数组中的对象?

问题描述 投票:0回答:1

我正在尝试创建一个 JSON 对象,该对象列出与特定用户关联的地图,但从未使用过嵌套 JSON 对象。这就是我想要的:

{
   "success":"list of users maps",
   "maps":[
      {
         "id":"1",
         "name":"Home to LE",
         "date_created":"1366559121"
      },
      {
         "id":"2",
         "name":"Test 1",
         "date_created":"1366735066"
      }
   ]
}

使用这个 Perl 代码:

  my $maps = [];
  for (my $x = 0; $x < $sth->rows; $x++) {
    my ($id, $name, $date) = $sth->fetchrow_array();
    my $map = qq{{"id":"$id","name":"$name","date_created":"$date"}};
    push $maps, $map;
  }
  my $j = JSON::XS->new->utf8;
  my $output = $j->encode({
    "success"=>"list of users maps",
    "maps"=>$maps
  });

但是我得到的输出是:

{
   "success":"list of users maps",
   "maps":[
      "{\"id\":\"1\",\"name\":\"Home to LE\",\"date_created\":\"1366559121\"}",
      "{\"id\":\"2\",\"name\":\"Test 1\",\"date_created\":\"1366735066\"}"
   ]
}

因此,当我在 Javascript 中处理它时,data.maps[x].id 是未定义的。我非常确定输出的 JSON 格式不正确。

谁能帮我解决这个问题吗?

json perl
1个回答
11
投票

它是

undefined
,因为你在
data.maps[x]
处拥有的不是一个对象,而是一个字符串。由于字符串没有名为
id
的属性,因此您将得到
undefined
。我可能会做这样的事情(如果我无法更改 perl 脚本):

var mapData = JSON.parse(data.maps[x]);
//do stuff with mapData.id

但是更好的做法是确保它不会将其编码为字符串,而是正确的 JSON。

perl 脚本中的这部分:

my $map = qq{{"id":"$id","name":"$name","date_created":"$date"}};

只是从所有数据中创建一个带引号的字符串。相反,您想要的是一个可以转换为 JSON 映射/关联数组的实际 Perl 哈希。所以试试这个:

my $map = {
    "id" => "$id",
    "name" => "$name",
    "date_created" => "$date"
};
push @$maps, $map;

这样你实际上就有了一个 perl 哈希值(而不仅仅是一个字符串),它将被转换为正确的 JSON。

作为示例,我编写了一些测试代码:

use strict;
use JSON::XS;

my $maps = [];
push @$maps, { id => 1, blah => 2 };
push @$maps, { id => 3, blah => 2 };

my $j = JSON::XS->new->utf8->pretty(1);
my $output = $j->encode({
    success => "list of blah",
    maps => $maps
});

print $output;

当你运行这个时,你会得到:

{
   "success" : "list of blah",
   "maps" : [
      {
         "blah" : 2,
         "id" : 1
      },
      {
         "blah" : 2,
         "id" : 3
      }
   ]
}
© www.soinside.com 2019 - 2024. All rights reserved.