如何防止jQuery的$ .getJSON将我的ajax响应键从字符串转换为整数?

时间:2011-12-14 19:32:19

标签: javascript jquery ajax arrays

我正在尝试使用按电子邮件排序的JSON响应对象来填充选择框,但JQuery似乎正在将键的类型从文本更改为整数,因此现在重新排序响应对象数字索引,搞砸了选择框的顺序。

所以json的反应如下:

{"2":"aaron@mail.com","1":"bernard@mail.com"}

代码类似于:

之后
$.getJSON('urlwithjsonresponse.com',function(response){
    console.log(response);
});

输出如下对象:

{1:"bernard@mail.com",2:"aaron@mail.com"}

如何阻止此转换/重新排序?

P.S。这也发生在$ .ajax

2 个答案:

答案 0 :(得分:5)

这里有两件事是错误的。

1)JSON密钥总是字符串。仅仅因为它是没有引号而写的并不是一个数字。它只是意味着密钥名称是“安全的”,即不包含空格或其他特殊字符。

2)绝对不能保证JSON哈希密钥具有任何特定顺序。如果你期待它们,那么你的期望是错误的。您应该将数据序列化为对象(或字符串)数组,而不是单个散列对象。

["bernard@mail.com","aaron@mail.com"]

[{key:1,value:"bernard@mail.com"},{key:2, value:"aaron@mail.com"}]

实际上做了三件事

3)你看到的输出与jQuery无关。这就是你给它的console.log()序列化哈希对象的方式。这是有效的(见#2)。

答案 1 :(得分:0)

如果你想在JSON转换后确保顺序正确,你应该在发送之前用PHP重新索引你的数组:

$a = [ 2 => "aaron@mail.com", 1 => "bernard@mail.com" ];
$a = array_values( $a );
exit( json_encode( $a ) );

这将确保至少对象中的元素按照您发送的顺序到达。如果您想要保留那些需要将它们添加到对象中的话,您将丢失密钥(以防万一) index是对象的ID,例如:)

$a = [ 
    2 => [ "id" => 2, "email" => "aaron@mail.com" ], 
    1 => [ "id" => 1, "email" => "bernard@mail.com" ]
];
exit( json_encode( array_values( $a ) );