js json.stringify到PHP json_decode

时间:2014-01-22 02:59:17

标签: php jquery json

我是JSON的新手。

在JS中,我创建了一个像这样的值数组:

var arrFields = $("td>.frmInput").map(function(){
    return  {
        id: this.id,
        value: $(this).val()
    };
}).get();

然后我将它们AJAX到服务器,如下:

$.ajax({
    type: "POST",
    url: "ajax/ax_all_ajax_fns.php",
    data: "Fields=" +JSON.stringify(arrFields),
    success: function(recd) {
        alert(recd);
    }
});

请注意,有一些字符串混合,加上JSON.stringified(?)数组。 (发送了其他字符串值,因此数据必须保留为字符串。)

在PHP方面,我需要将收到的Fields字符串转换为关联数组。

这样做:

$jsonAsStr_Fields = $_POST['Fields'];
die($jsonAsStr_Fields);

alert()

中返回此文本字符串
[{"id":"rateDriver","value":"Jacques Villeneuve"},{"id":"rateCar","value":"Chev"}]

这样做:

$arrFields = json_decode($jsonAsStr_Fields, TRUE);
$driver = $arrFields['rateDriver'];
$car = $arrFields['rateCar'];
$tire = $arrFields['rateTire'];
die('Driver: [' .$driver. '] Car: [' .$car. ']  Tire: [' .$tire. ']');

返回:

Driver: [ ]  Car: [ ]  Tire: [ ]

如何将$ jsonAsStr_Fields字符串转换为assoc数组,从而将正确的值输出到警报?

3 个答案:

答案 0 :(得分:1)

请改为创建值:

var arrFields = {};
$("td>.frmInput").each(function(){
    arrFields[this.id] = $(this).val();
});

这将在JSON字符串化时创建一个对象,如下所示:

{"rateDriver":"Jacques Villeneuve", "rateCar":"Chev"}

这似乎是您要在PHP代码中使用的格式。

答案 1 :(得分:1)

你有一组关联数组,你的数组没有指定的道具,rateDriver例如是第一个数组的元素id的值:

$driver = $arrFields[0]['id'];
$car = $arrFields[1]['id'];

要查看数组的内容,请使用着名的var_dump函数。

答案 2 :(得分:0)

来自作者:

对于那些尚未完全理解解决了这个问题的人。

潜在的问题是,在AJAX中,字符串化的JSON在途中被修改(在点击提交按钮后到达PHP端)。所有引号都被转义,这使得该字符串无法与json_encode一起使用。

这是通过在接收数据到达PHP端时抓取接收数据的值来发现的:

$jsonAsStr_Fields = $_POST['Fields'];
die($jsonAsStr_Fields);

并在AJAX成功函数中提醒收到的数据:

success: function(recd) {
    alert(recd);
}

上述两个都在OP中描述。

然而,因为我认为这是一个无关的问题,我在发布问题时“修复”了alert()框中显示的字符串。要吸取的教训:不要帮助 - 只发布你实际看到的内容。

它真的显示如下:

{\"id\":\"rateDriver\",\"value\":\"Jacques Villeneuve\"}

但是我写道它显示如下:

{"id":"rateDriver","value":"Jacques Villeneuve"}

当然,json_decode() PHP函数不知道如何处理反斜杠,所以字符串没有转换。

解决方案是在PHP端对收到的JSON字符串使用 str_replace()来解决问题,如下所示:

str_replace("\\", "", $_POST['Fields']);