6

我正在尝试创建一个 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 格式不正确。

任何人都可以帮我解决它吗?

4

1 回答 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
      }
   ]
}
于 2013-04-23T17:23:29.050 回答