【问题标题】:Can't access returned json in jquery无法在 jquery 中访问返回的 json
【发布时间】:2015-05-04 19:04:43
【问题描述】:

这可能是我缺少的一些简单的东西,但我一直在谷歌上寻找答案,但没有任何工作。

我想做的事:

我正在对我的服务器进行 ajax 调用,以获取一些以 json 格式返回的简单数据

我遇到的问题:

我尝试了几种访问 json 数据的方法,但得到的错误范围从“未定义”、“未捕获的 TypeError:无法读取属性...”到“未捕获的 SyntaxError:意外的令牌 o”。

我的尝试:

这是 jquery (v1.11.1) ajax 调用:

$.getJSON(ajax_url, function(data){

    // I've tried the commented out items below
    // var data = $.parseJSON(data);
    // var data = JSON.parse(data);
    // var data = data[0];

    alert(data.test);

});

为了让事情变得超级简单,我尝试访问以下 php 返回的非常简单的 json,但失败了:

header('Content-Type: application/json');
$test = array('test' => 'test data');
echo json_encode($test);
exit;

在有人问之前,我已经仔细检查以确保 ajax_url 通过将 url 记录到 js 控制台来访问正确的页面,并通过在脚本运行时创建错误日志条目来记录 php 端的访问调用。

我想要什么:

如果有人能告诉我我做错了什么,以及如何从返回的“测试”键中轻松获取“测试数据”,我会很高兴。

编辑:

运行 console.log(data) 提供以下信息:

Object {success: "true"}

编辑编辑:

问题是在我的实际脚本中回显成功 => true 数组。在添加测试 => 测试数据之前我忘了删除它。

【问题讨论】:

  • 从console.log(data)开始
  • 如何提醒alert(JSON.stringify(data))
  • data 是一个具有单个属性的对象,success。您可以通过data.success 访问成功值。它不是包含 JSON 的字符串,因此您无法解析它。事实上,$.getJSON已经为你解析了 JSON,这就是它的全部目的。它也不是一个数组,所以你不能访问它的第一个元素 (data[0])。您似乎没有从您声称的 PHP 脚本中返回数据。
  • @rmmoul:console.log(data) 输出Object {success: "true"} 的事实证明data 是一个JavaScript 对象。如果你不相信我,请console.log(typeof data)$.getJSON 已经为您解析 JSON。这就是$.getJSON 所做的。
  • 哦,我知道 PHP 脚本返回 JSON。我的意思是 data 已经是解析后的响应。 $.getJSON 的全部目的是为你解析 JSON,这样你就不用再做这些了。

标签: javascript php jquery ajax json


【解决方案1】:

所以如果它返回一个 json 作为字符串,那么你的数据就可以了 试试这段代码

var tempData = $.parseJSON(data);
$.each(tempData, function(k, v) {
    //display the key and value pair
    alert("key= " + k + "and value= "+ v);
});

【讨论】:

  • $.getJSON 是异步的。它返回一个承诺。
  • @FelixKling 我没有使用 getJSON 吗?
  • 对不起,我的错。但是data已经是一个对象,所以无法解析。
【解决方案2】:

tl;dr:您无法访问data.test,因为您没有收到具有属性test 的对象。要么您点击了错误的 URL,要么您生成的数据与您声称的不同。


console.log(data) 输出Object {success: "true"} 的事实告诉您data 是一个JavaScript 对象。证明:

> console.log({success: true});
Object {success: true}

如果它是一个包含 JSON 的字符串,你会看到这个:

> console.log('{"success": true}');
 {"success": true}

因此,data 是一个具有单个属性 success 的对象。您可以通过data.success 访问成功值。它不是包含 JSON 的字符串,因此您无法解析它。事实上,$.getJSON已经为您解析 JSON,这就是它的全部目的:

success 回调传递返回的数据,该数据通常是由 JSON 结构定义并使用 $.parseJSON() 方法解析的 JavaScript 对象或数组。

它也不是一个数组,所以你不能访问它的第一个元素 (data[0])。

我尝试了几种访问 json 数据的方法,但得到的错误范围从“未定义”、“未捕获的 TypeError:无法读取属性...”到“未捕获的 SyntaxError:意外的令牌 o”。

您收到语法错误,因为您尝试将 JavaScript 解析为 JSON。复制错误的最简单方法:

> JSON.parse({});
 Uncaught SyntaxError: Unexpected token o

这是因为JSON.parse 需要一个字符串。如果参数不是字符串,则将其转换为 1。对象转换成什么?

> String({})
"[object Object]"

所以你和以上调用 JSON.parse("[object Object]")"[object Object]" 不是有效的 JSON。

【讨论】:

  • 看起来这是我的错误。在我的实际脚本中,我正在创建 $test = array('success' => 'true');并呼应它然后退出。所以它工作正常,我只是匆忙错过了这个错误。
  • 你的问题做得很好,它包含了所有相关信息。我对其他显然没有正确查看该信息的人感到不安(从而将您引向了一个非常错误的方向)。
  • 我真的应该仔细看看。 success => true 并没有注册为错误,因为那是我试图得到的实际响应,并且在我的挫折中(不知道我可以直接访问 data.success)我完全错过了我的错误。
  • 关于对象的更多信息,以备不时之需(不知道你的背景):developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
  • @rmmoul:如果你想自己动手,可以使用$.get ;) 无论如何,祝你编码愉快!
猜你喜欢
  • 2015-02-03
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多