【问题标题】:Sending json via jquery ajax not working通过 jquery ajax 发送 json 不起作用
【发布时间】:2012-02-17 04:33:07
【问题描述】:

我正在发出 AJAX 请求并发送一些 JSON:

 $(function() {
     var json = [{"id":"1", "area":"south"}, {"id":"2", "area":"north"},{"id":"3", "name":"east"},{"id":"1", "name":"west"}];

     jQuery.ajax({
         url: "index.php",
         type: "POST",
         data: {areas: JSON.stringify(json) },
         dataType: "json",
         beforeSend: function(x) {
             if (x && x.overrideMimeType) {
                 x.overrideMimeType("application/j-son;charset=UTF-8");
             }
         },
         success: function(result) {
         alert(result);
         }
     });

然后我尝试在另一端使用json_decode 将其解码为对 PHP 有用的东西:

<?php
    if(isset($_POST['areas'])) {
        $json = $_POST['areas'];
        $obj = json_decode($json);
        var_dump($obj);
        exit;
    }
?>

AJAX 帖子变得正常,如果我在 if(isset$_POST) 中添加回声,我会得到它,所以它似乎正在发送。但我只从代码中返回Null。谁能看到我错过了什么?

【问题讨论】:

  • 如果在 PHP 脚本中回显 $_POST['area'] 变量(不通过 json_decode() 运行它的值)会得到什么?
  • 嗨 Jasper,如果我按照您的建议打印帖子,我会返回一个数组...Array ( [0] => Array ( [id] => 1 [area] => south ) [ 1] => 数组 ( [id] => 2 [area] => 北 ) [2] => 数组 ( [id] => 3 [name] => 东 ) [3] => 数组 ( [id] = > 1 [name] => west ) ) 但这对我来说毫无意义。在我解码之前它不应该是一个数组吧?
  • 你正在从一个对象创建一个字符串; jQuery 然后将您的字符串转换为查询字符串参数;然后 PHP 将获取该查询字符串参数并将其转换回一个对象。这与在表单的name 属性中使用[] 创建数组的行为相同。似乎问题在于您正在尝试从对象创建对象(您尝试做的太多了!)。
  • 我没有关注。我认为这是正确的方法吗?有什么想法可以让它发挥作用吗?
  • 如果当你print_r($_POST['areas']) 得到你想要的结构时,不要对它做任何事情,删除$obj = json_decodE($json); 行或将其更改为$obj = $_POST['areas']

标签: php jquery ajax


【解决方案1】:

怎么样:

$obj = json_decode($json, true);

x.overrideMimeType("application/j-son;charset=UTF-8"); 也不应该是x.overrideMimeType("application/json;charset=UTF-8");

【讨论】:

  • 您好,感谢您的修改。我已经进行了这些更改,但仍然从上面的 var_dump 中返回 NULL
【解决方案2】:

我相信您可以直接将json 数组传递给AJAX 函数并跳过JSON.stringify 函数调用:

$(function() {
     var json = [{"id":"1", "area":"south"}, {"id":"2", "area":"north"},{"id":"3", "name":"east"},{"id":"1", "name":"west"}];

     jQuery.ajax({
         url: "index.php",
         type: "POST",
         data: {areas: json },
         dataType: "json",
         beforeSend: function(x) {
             if (x && x.overrideMimeType) {
                 x.overrideMimeType("application/j-son;charset=UTF-8");
             }
         },
         success: function(result) {
             alert(result);
         }
    });
});

更新

如果这是运行 json_decode 之前 PHP 脚本中 $_POST['area'] 变量的输出:

Array (
    [0] => Array ( [id] => 1 [area] => south )
    [1] => Array ( [id] => 2 [area] => north )
    [2] => Array ( [id] => 3 [name] => east ) 
    [3] => Array ( [id] => 1 [name] => west )
)

那么你不需要运行json_decode,因为你已经有了你想要的对象。

【讨论】:

  • 不幸的是没有区别
  • 是的,就是这样!但是怎么做?这对我来说意义不大。我也可以循环并得到结果
  • PHP 解析引擎会自动为您执行此操作。这与通过将[] 添加到其名称属性的末尾(例如&lt;input type="text" name="some_text[]" /&gt;&lt;input type="text" name="some_text[]" /&gt;)来制作表单输入数组相同。给定这些示例输入,PHP 将为您提供如下数组:$_POST['some_text'] = Array ( [0] =&gt; '' [1] =&gt; '' )
  • 我不知道。感谢您的帮助贾斯珀。
【解决方案3】:

您不必使用 stringify jQuery 会处理它。试试这个。

$(function() {
     var json = [{"id":"1", "area":"south"}, {"id":"2", "area":"north"},{"id":"3", "name":"east"},{"id":"1", "name":"west"}];

     jQuery.ajax({
         url: "index.php",
         type: "POST",
         data: {areas: json },
         dataType: "json",
         beforeSend: function(x) {
             if (x && x.overrideMimeType) {
                 x.overrideMimeType("application/j-son;charset=UTF-8");
             }
         },
         success: function(result) {
         alert(result);
         }
     });
});

【讨论】:

  • 不幸的是没有区别
【解决方案4】:
$(function() {
     var json = [{"id":"1", "area":"south"}, {"id":"2", "area":"north"},{"id":"3", "name":"east"},{"id":"1", "name":"west"}];

 jQuery.ajax({
     url: "index.php",
     type: "POST",
     data: {areas: JSON.stringify(json) },
     //dataType: "json",
     beforeSend: function(x) {
         if (x && x.overrideMimeType) {
             x.overrideMimeType("application/j-son;charset=UTF-8");
         }
     },
     success: function(result) {
     alert(result);
     }
 });

您正在转储不是 json 的响应,dataType 参数告诉函数期望的响应类型。如果你什么都不放,它会给你你所期望的,一个来自 PHP 脚本的 var_dump。 (这已通过您发布的代码进行了验证)。

【讨论】:

    猜你喜欢
    • 2013-01-09
    • 2013-03-04
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多