0

假设我在 JavaScript 中有这个对象,它是这样构建的:

var obj = {};
var fields = ['table_name[field_name]', 'tale_name[field_name_2]']

for(var i; i < fields.length; i++){
    obj[fields[i]] = someBulkOfData;
}

登录控制台时,obj会输出

{
   table_name[field_name]   : {...},
   tabke_name[field_name_2] : {...}
}

这一切正常,直到我通过 jQuery.ajax() 通过 PHP 传递对象。

当我在 PHP 中收到我的请求时,数组如下所示:

[
    ['table_name[field_name']   => ...,
    ['table_name[field_name_2'] => ...
]

所以这里发生的事情是在发送 AJAX 请求和接收 PHP 中的数据之间的某个地方,每个键的最后一个方括号都消失了。

有人可以向我解释为什么会发生这种情况,以及是否有一种巧妙的方法来解决这个问题?

我有一个解决方案的标准,那就是我不能更改键(例如'table_name\[field_name\]')。

4

3 回答 3

1

你试过用$.serialize()吗?

使用 serialize 将 javascript 对象转换为可以通过 AJAX 轻松传输的字符串 - 如下所示:

var ajaxableString = $(obj).serialize();
于 2013-02-06T15:41:18.563 回答
0

您可以通过重组 JS 对象来解决该问题:

{
  table_name : {
    field_name_1 : {...},
    field_name_2 : {...}
  },
  another_table : {
    ...
  }
}

这样你就可以避免那种奇怪的命名约定。

另外,我怀疑你对我们隐瞒了什么。在 this 和 PHP 之间有一些东西(一个操作),可能在你的 AJAX 代码的某个地方,你没有告诉我们。也许您正在将此对象序列化为一个字符串并将该字符串作为一个查询参数传递给服务器。这个序列化步骤可能是原因。

但为了确定,您可以检查调试器的 Net 部分并检查请求标头是否发送的数据格式完美。

据我所知,jQuery.ajax接受一个 JS 对象作为数据,并将其完美地转换为查询字符串。这样,您无需手动对其进行序列化。

于 2013-02-06T15:40:57.497 回答
0

借助@fab,解决方案是使用 JSON 对数据进行编码:

$.ajax({
    data : {
        obj:JSON.stringify(obj)
    },
    ...
});

在 PHP 中:

json_decode($_REQUEST['obj']);

这将输出一个完美的 stdClass 对象,并保留键。

于 2013-02-07T09:01:06.693 回答