如何防止jQuery's $.getJSON从转换我的ajax响应键从字符串到整数

How can I prevent jQuery's $.getJSON from converting my ajax response keys from strings to integers?

本文关键字:ajax 我的 转换 响应 整数 字符串 getJSON jQuery 何防止      更新时间:2023-09-26

我试图使用一个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"}

如何防止这种转换/重新排序?

注。对于$.ajax

也是如此

这里有两点不对。

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()如何序列化你给它的哈希对象。

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

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

这将确保对象中的元素至少以您发送它们的顺序到达。您将丢失键,如果您想保留这些键,则需要将它们添加到对象中(例如,如果索引是对象的ID):

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