无法在jquery中访问返回的json

rmm*_*oul 4 javascript php ajax jquery json

这可能是我想念的简单事情,但我一直在谷歌上寻找答案,并没有得到任何工作.

我正在做的事情:

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

我遇到的问题:

我已经尝试了一些方法来访问json数据,但是从"undefined","Uncaught TypeError:无法读取属性......"到"Uncaught SyntaxError:Unexpected token 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);

});
Run Code Online (Sandbox Code Playgroud)

为了使事情变得非常简单,我尝试并且无法访问由以下php返回的非常简单的json:

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

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

我想要的是什么:

如果有人能让我知道我做错了什么,我会喜欢它,以及我如何轻松地从"测试"键返回"测试数据".

编辑:

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

Object {success: "true"}
Run Code Online (Sandbox Code Playgroud)

编辑编辑:

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

Fel*_*ing 6

tl; dr:您无法访问,data.test因为您没有收到带有属性的对象test.您要么输入错误的URL,要么生成的数据与您声明的数据不同.


张女士console.log(data)输出Object {success: "true"}告诉你,data是一个JavaScript对象.证明:

> console.log({success: true});
Object {success: true}
Run Code Online (Sandbox Code Playgroud)

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

> console.log('{"success": true}');
 {"success": true}
Run Code Online (Sandbox Code Playgroud)

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

success回调被传递返回的数据,其通常是JavaScript对象或阵列由JSON结构所定义和使用所解析的$.parseJSON()方法.

它也不是数组,因此您无法访问它的第一个元素(data[0]).

我已经尝试了一些方法来访问json数据,但是从"undefined","Uncaught TypeError:无法读取属性......"到"Uncaught SyntaxError:Unexpected token o"都有错误.

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

> JSON.parse({});
 Uncaught SyntaxError: Unexpected token o
Run Code Online (Sandbox Code Playgroud)

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

> String({})
"[object Object]"
Run Code Online (Sandbox Code Playgroud)

所以你和你打电话JSON.parse("[object Object]"),"[object Object]"并不是有效的JSON.