【问题标题】:not receiving JSON from php with getJSON没有使用 getJSON 从 php 接收 JSON
【发布时间】:2013-10-14 22:55:39
【问题描述】:

我正在尝试使用 php 和 jquery 将数组传递给浏览器,但是当我尝试使用从 php 的 encode_json 返回的“数据”时,它出现未定义。我只是在学习 php、jquery 和 json,到目前为止还没有找到关于很多这些东西的很好的文档,尤其是 json,即使在我拥有的书中也是如此。提前致谢!

这是我拥有的 jquery 的精简版

$(document).ready(function(){
    var jsonResult;//I will want to be able to use the data in other functions

    $.getJSON("json.php", function(data){  
        jsonResult = data;
        var str;
        var nuts = [203,204,205,207];

        str = '<p>' + data[nuts[0]].NutraDesc + '</p>';
        $('#stuff').html(str);
        }
    );
});

这是 php:

    include_once 'databasePHP.php';
        $json_tst = $db->query( "SELECT  def.Nutr_No, NutrDesc, Nutr_Val, Units 
                FROM nutr_def as def  JOIN nut_data as data  ON def.Nutr_No = data.Nutr_No 
                WHERE data.NDB_No = 1001 LIMIT 0, 2");

        $food = array();

        while($row = $json_tst->fetch(PDO::FETCH_ASSOC))
        {
           $Nutr_No = $row['Nutr_No'];
           $food[$Nutr_No][] = array(
               'NutrDesc' => $row['NutrDesc'],
               'Nutr_Val' => $row['Nutr_Val'],
               'Units' => $row['Units']
           );
        };

        echo  json_encode($food);
?>

它返回我在 jsonlint.com 上检查的这个 json,它说它是有效的:

 {"203":[{"NutrDesc":"Protein","Nutr_Val":"0.85","Units":"g"}],"204":[{"NutrDesc":"Total lipid (fat)","Nutr_Val":"81.11","Units":"g"}]}

【问题讨论】:

  • 立即跳出来给我的东西可能是一个错字。您正在寻找 data[nuts[0]].NutraDesc,但它在您向我们展示的 JSON 和 PHP 中称为 NutrDesc
  • 我不敢相信我没有看到!不幸的是,它仍然无法正常工作。

标签: php jquery getjson


【解决方案1】:

它可能不起作用,因为数字应该是字符串。尝试在坚果中的数字周围添加引号,如下所示:

var nuts = ["203","204","205","207"];

以下可能也有效:

str = '<p>' + data[String(nuts[0])].NutraDesc + '</p>';

另外,您是否尝试将 console.log(data); 添加到 getJSON 函数以确保它接收 JSON?

编辑: 这是您的代码中的一个有效的 JSFiddle: http://jsfiddle.net/rKLqM/

出错的地方:

  • 您没有将结果解析为 JSON (JSON.parse)
  • NutraDesc 拼写错误
  • 您没有将数字转换为字符串
  • 您需要将 [0] 添加到 jsonResult,因为其中有一个额外的数组(请参阅 [])

【讨论】:

  • 我添加了 console.log,它返回了这个(数据在数组中): Object 203: Array[1] 204: Array[1] proto: Object
  • 我用一些工作代码为你更新了我的答案,检查链接:)
  • 一个好的建议是在出现问题时记录您所做的每一步。控制台中的结果表明除了解析之外一切正常,因此请尝试记录各个变量以缩小问题所在。还;在 JSON 结果中,大括号表示对象,方括号表示数组,因此要访问 var foobar = {"var" : ["foo", "bar"] } 中的 bar,您可以使用 foobar["var"][1]。祝你好运!
  • 如果我早点发布这个问题,我本可以回到三天!谢谢!!是额外的 [0] 最终做到了。您对这个主题(尤其是 JSON)有什么建议吗?
  • 很高兴我能帮上忙!也许一个好的开始是更多地了解 JavaScript 数组和对象(并使用 for loop 遍历它们),因为 JSON 由这些组成。至于日志记录:如果您没有得到想要的结果,请尝试退后一步。如果console.log(data[nuts[0]].NutraDesc 返回undefined,试试console.log(data[nuts[0]]) 看看会返回什么。
【解决方案2】:

在 Javascript 中可以使用 obj["propName"] 访问对象属性

所以,改变

var nuts = [203,204,205,207];

var nuts = ["203","204","205","207"];

【讨论】:

  • 感谢您的回复,很遗憾没有解决问题
  • 要么使用此建议,要么使用我的 String(nuts[0]) 建议,以及 @Archer 给出的提示:“您正在寻找数据[nuts[0]].NutraDesc,但它在您向我们展示的 JSON 和 PHP。”
  • 我已经更改了数组以包含引号(很高兴知道!)并尝试使用 String(nuts[0]) 但不幸的是,两者都不起作用。我真的认为 Shankar 提到的错字会解决它,但它仍然会在屏幕上打印“未定义”。
  • 查看我更新的答案以获取一些工作代码。只需删除 var data = "long-json-string-here";
猜你喜欢
  • 2011-11-26
  • 1970-01-01
  • 2018-03-22
  • 2018-09-17
相关资源
最近更新 更多