我正在尝试使用ajax发布字典。但是我遇到了json和“]”字符的一些问题。
以下是我的代码示例(javascript):
var dict = {"id":"patient","where":{"name[~]":"J"}};
$.post("./ajax.php",{data:dict},function(data){
});
和ajax.php(这个文件只处理$ _POST数组中的json编码数据):
$where = $_POST["data"]["where"];
基本上我正在尝试将json格式的消息发送到php,并且我想要处理数据。
我在javascript端尝试了json_encode和解码的整个组合,javascript方面也是JSON.stringify(),尝试使用右括号的转义字符。
但是当我转储$ _POST [“data] [”where]时,值为“J”,键为“name [〜”而不是“name [〜]”。右括号从键上消失。
有人有任何建议吗? 感谢您的帮助,我几个小时都一直在努力......
//编辑:我已经想通了,我放在“]之后的所有东西都从钥匙上消失了。所以密钥从“name [〜] asdf”转换 - > “名称[〜” ...
答案 0 :(得分:1)
当你为jQuery AJAX函数提供一个对象时,它会对它进行URL编码。 jQuery将data.where
参数发送为:
data[where][name[~]]=J
和PHP显然不能像这样处理嵌套括号;它只与[
之前的name
与下一个]
匹配。
可能jQuery需要对此属性名称进行双重编码以保护它,但显然它没有。
解决方法是将dict
编码为JSON,并在PHP中对其进行解码。 JS:
$.post("./ajax.php",{data: JSON.stringify(dict)},function(data){
PHP:
$data = json_decode($_POST['data'], true);
$where = $data['where'];
var_dump($where);
答案 1 :(得分:0)
我在与JSON.stringify
的联结中尝试json_decode
,结果看起来不错:
<强> JS 强>
$.ajax({
url: './ajax.php',
method: 'post',
data: "data="+JSON.stringify(dict)
});
<强> PHP 强>
json_decode($_POST['data'], true);
我认为你应该指定JSON是关联的,将$assoc
参数设置为true
。请参阅this。
您还可以将数据作为JSON(非字符串)发送,然后使用php://input
流读取原始发布数据,并在检索到的数据上使用json_decode
并将$assoc
设置为true ;因为看起来编译成PHP的开箱即用方法效率低下。
答案 2 :(得分:0)
另一个对我有用的解决方案:
<强> JS 强>
$.ajax({
url: 'recAjax.php',
method: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(dict)
});
<强> PHP 强>
var_dump(json_decode(file_get_contents('php://input'), true));