为什么这些对象属性未定义?

时间:2014-06-25 18:16:53

标签: javascript php jquery ajax

我尝试使用json_encode来访问我的php脚本返回的对象的属性,如下所示:

PHP

echo json_encode(array(
  'person_id' => $personID,
  'job_id' => $jobID)
);

JS

$.ajax({
  url: url,
  cache: false,
  type: "POST"
}).done(function(sData){
  console.log(sData);
  console.log(sData.job_id);
  console.log(sData.person_id);
});

输出:

{"person_id":1,"job_id":1}
undefined
undefined

这里发生了什么?为什么我无法访问这些属性?

更新

对于任何未来的访问者来说,这是我之前做过很多次的错误(遗漏dataType)并且肯定会重新制作。

这可能会特别令人困惑,因为当您在Chrome开发工具中检查服务器响应时,它会自动解析为JSON对象(在PREVIEW选项卡中)。

enter image description here

Chrome执行此操作很不错,因此您可以轻松检查您的响应数据,但是对于您的javascript代码也是如此,您需要声明响应的正确dataType这样您的代码就可以将数据解释为对象而不是字符串。

3 个答案:

答案 0 :(得分:4)

默认情况下,

$.ajax不会将响应评估为JSON。你必须通过dataType: 'json'

这应该这样做

$.ajax({
    url: url,
    cache: false,
    type: "POST",
    dataType: 'json'
}).done(function(sData){
        console.log(sData);
        console.log(sData.job_id);
        console.log(sData.person_id);
});

答案 1 :(得分:1)

PHP返回一个字符串值。必须将此值解析为javascript对象。试试这个:

 $.ajax({
   url: url,
   cache: false,
   type: "POST"
 }).done(function(sData){
   sData = JSON.parse(sData);
   console.log(sData);
   console.log(sData.job_id);
   console.log(sData.person_id);
});

JSON不是对象/关联数组,而是一个字符串表示形式。 JSON允许您跨语言发送对象,但必须将其从字符串解析为该语言的值。在jQuery中,你可以设置dataType,但重要的是在任何语言中都要解析JSON。

答案 2 :(得分:-2)

sData - 字符串

使用jQuery.parseJSONjQuery.getJSON()