我正在尝试使用按电子邮件排序的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
上答案 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 ) );