【问题标题】:jQuery ajax() returning json object but not alerting properlyjQuery ajax() 返回 json 对象但没有正确提醒
【发布时间】:2013-01-29 19:04:20
【问题描述】:

为什么我不能使用 data[0].id 返回 id?

    $(document).ready(function(){   
$.ajax({
  type: 'POST',     
  dataType: "json",
  url: '<?php echo matry::base_to('tests/map_it');?>',
  success: function (data) 
  {
     alert(data[0])
    $('#alerts').html(data);
    data[0].id

  }

  });
});

这是返回的警报。

    {"id":19385,"first":"RLY","last":"MAZI",
    "trainer_address1":"19 NE 13H CRT",
    "trainer_address2":null,"CITY":"MII","STATE":"AL",
    "trainer_zip":"33333","trainer_phone":"(721)222-4444","trainer_fax":null,
    "trainer_cell":"(213)213-  2133","website_trainer_id":115,"trainer_email":"MO@gmail.COM",
"trainer_group":"","inactive":null}

任何帮助将不胜感激。

编辑 这是返回该 json 的 php:

$mapit = sql::results("Select * from event.ACS.trainer where inactive is null or inactive=0");
foreach ($mapit as $row)
{
    $return[] = json_encode($row, JSON_FORCE_OBJECT);
}
echo json_encode($return);

我必须遍历并编码每一行,否则,ajax 函数不会认为有返回的 json(并且我的数据变量为空)

【问题讨论】:

  • 你能发布你的生成 json 的 php 吗?如果您的警报确实包含它,那么您就是双重 json 编码。
  • 您发布的 JSON 是显示在警报框中(来自 alert() 调用)还是 #alert 元素的内容?
  • 你好,我知道,我尝试提醒 data[0].id 并且我得到未定义(我刚刚提醒提醒数据 [0] 以验证那里有值。
  • 看起来函数中的数据参数是单个对象而不是数组。您是否尝试仅引用数据对象而不是 data[0]?
  • 您应该使用console.log(data) 而不是alert(data)。然后使用您的浏览器开发工具,您可以检查返回的实际 JSON 对象。

标签: php jquery ajax json


【解决方案1】:

你真正的问题在于你的 PHP:

$mapit = sql::results("Select * from event.ACS.trainer where inactive is null or inactive=0");
foreach ($mapit as $row)
{
    $return[] = json_encode($row, JSON_FORCE_OBJECT);
}
echo json_encode($return);

您正在对数据进行双重 json_encoding,这导致内部 JSON 在返回到您的 Javascript 时被视为 JSON 形式的字符串。

你应该这样做:

$mapit = sql::results("Select * from event.ACS.trainer where inactive is null or inactive=0");
foreach ($mapit as $row)
{
    $return[] = $row;
}
echo json_encode($return);

请注意,我已经删除了最里面的 json_encode。

现在,您无需在 Javascript 中使用 .parseJSON() 调用。此解决方案将比公认的解决方案更有效,后者并没有解决真正的问题。

这样会更有效率,因为

  1. 您不是对不需要编码的数据进行双重编码 PHP。
  2. 您没有解码不需要编码的数据 Javascript。

因此,您消除了 2 个不必要的操作和许多浪费的循环(因为这些操作包含在循环中)。

【讨论】:

  • $mapit 已经是一个多维数组,但是当我只是 json_encode $mapit 时,我的成功函数没有得到任何结果(因为我将 dataType 设置为 json)。由于某种原因,ajax 调用未将结果识别为 json
  • 如果我删除 dataType: 'json' 它工作得很好,为什么我不能将数据类型定义为 json 并且仍然可以工作?
  • 请发布print_r($mapit); 的输出 如果它只是一个数组(任意维数),那么json_encode 将正确地将其转换为JSON。虽然它可能是一个关联数组,但在这种情况下,使用 data[0] 访问它在 Javascript 中不起作用。
  • 您的回答对我也有帮助:我不小心用json_encode() 进行了双重编码,一次在方法中,然后在方法的结果中再次编码。当您只使用dataType:"json" 时,您提到根本不需要$.parseJSON,这真是太好了。我发现很多已接受的答案不必要地使用$.parseJSON
【解决方案2】:

data[0] 看起来像 JSON,因此您必须先对其进行解析,然后才能将其用作对象。例如$.parseJSON(data[0]).id

【讨论】:

  • 不是,因为他指定dataType为json:dataType: "json",data已经是JSON了。
  • @crush 我说data[0] 是 JSON 也是我想你真的不知道 JavaScript Object Notation 和 JavaScript Object 之间的区别
  • 所以真正的问题是他对数据进行了双重编码。可能想在你的回答中说明这一点。
  • @TimothyRadzikowski 这只是治疗症状,你真的应该在它的源头(php)上解决问题。
【解决方案3】:

看起来它只是一个被返回的对象而不是一个数组,所以你应该能够使用 data.id 访问 id 属性,无需指定数组索引。

【讨论】:

    【解决方案4】:

    尝试将“Content-Type: application/json”添加到您的响应标头中。添加此标头 Google Chrome、Opera、Safari 和 IE 会自动将您的字符串转换为 JSON 对象。

    如果您添加此标头,则仅在 Firefox 上才需要 parseJSON。

    如果您不想添加该标头,则“JSONObject = jQuery.parseJSON(response);”在您的 javascript 中需要将字符串转换为 JSON 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多