2014-01-22 28 views
3

我是JSON的新手。js json.stringify to PHP json_decode

在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数组,并将正确的值输出到alert中?

回答

1

做到这一点,而不是为你创造价值:

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

这将创建一个对象,当JSON-字符串化,看起来像这样:

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

这似乎是你的格式想在你的PHP代码中使用。

+0

非常有帮助。 ** + 1 **我现在看到我应该如何创造价值。但是,在PHP方面,它仍然不会导致assoc数组。 $ arrFields = json_decode($ jsonAsStr_Fields,TRUE);'仍然输出:'Driver:[] Car:[] Tyre:[]' – gibberish

+1

最后一个问题是,字符串化数据到达PHP端报价标记逃脱,像这样:'{\“rateDriver \”:\“Jacques Villeneuve \”,\“rateCar \”:\“Chev \”}' - 我认为这是发生在回程(进入警报)。添加一个PHP ** str_replace **'$ jsonAsStr_Fields = str_replace(“\\”,“”,$ _POST ['Fields']);'解决了这个问题。你的建议让我走上了正确的轨道。谢谢。 – gibberish

+0

您运行的是哪个版本的PHP?魔术引号自5.3以来已被弃用:http://www.php.net/manual/en/security.magicquotes.php –

1

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

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

为看你使用数组的内容着名的var_dump功能。

+0

谢谢。你已经清楚地解释了我的错误。 +1现在了解如何重构代码以获得解决方案。 – gibberish

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端使用str_replace()函数上接收到的JSON字符串了,解决这个问题,像这样的:

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