Javascript 无法读取某些JSON对象的属性

Javascript 无法读取某些JSON对象的属性,javascript,jquery,json,Javascript,Jquery,Json,我正在写一个简单的脚本,将通过MLB API显示美国职业棒球大联盟的得分。我正在拉入主记分板json文件并访问一些值。在我开始访问游戏的实际分数之前,一切都很顺利,这些分数是JSON文件中的嵌套对象 以下是我所拥有的: var mlb = 'http://mlb.mlb.com/gdcross/components/game/mlb/year_2016/month_04/day_07/master_scoreboard.json'; i = 0; $.ajax({ url: mlb,

我正在写一个简单的脚本,将通过MLB API显示美国职业棒球大联盟的得分。我正在拉入主记分板json文件并访问一些值。在我开始访问游戏的实际分数之前,一切都很顺利,这些分数是JSON文件中的嵌套对象

以下是我所拥有的:

var mlb = 'http://mlb.mlb.com/gdcross/components/game/mlb/year_2016/month_04/day_07/master_scoreboard.json';

i = 0;

$.ajax({
  url: mlb,
  dataType: 'json',
  success: function(data){

    var games = data.data.games.game;

    $.each(games, function() {
      var home  = games[i].home_team_name,
          away  = games[i].away_team_name,
          venue = games[i].venue,
          homeScore = games[i].linescore.r.home,
          awayScore = games[i].linescore.r.away;

         $('<p>' + home + ' vs ' + away + ' - ' + venue + '</p>').appendTo('#scoreboard');
         $('<p>' + homeScore + ' - ' + awayScore + '</p>').appendTo('#scoreboard');
         i++;
      });
     }
    });

    // why is the dbacks (game 7) game not showing when linescores are displayed?
var mlb='1〕http://mlb.mlb.com/gdcross/components/game/mlb/year_2016/month_04/day_07/master_scoreboard.json';
i=0;
$.ajax({
网址:mlb,
数据类型:“json”,
成功:功能(数据){
var games=data.data.games.games;
$。每个(游戏、功能(){
var home=games[i]。home\u团队名称,
客场=比赛[i]。客场球队名称,
地点=比赛[i]。地点,
homeScore=games[i].linescore.r.home,
awayScore=games[i].linescore.r.away;
$(“”+主场+”vs“+客场+”-“+Visite+”

”)。附录(“#记分板”); $(“”+homeScore+”-“+awayScore+”

”)。附录(“#记分板”); i++; }); } }); //为什么dbacks(第7场)游戏在显示linescores时不显示?
如果我简单地注释掉
homeScore
awayScore
变量,丢失的游戏(例如Dbacks vs Cubs游戏)就会重新出现

我得到一个错误:

未捕获类型错误:无法读取未定义的属性“r”

但是当我使用JSON查看器时,对象
linescore.r
看起来与任何其他游戏一样,如果我将
I
变量更改为
7
(dbacks游戏的id),并删除
I++
,它将显示dbacks游戏的正确值

您可以在此处找到代码笔的链接:


谢谢

似乎有些数据不包含linescore。在使用之前,您需要检查该属性

 homeScore = games[i].linescore ?jQuery.parseJSON(games[i].linescore.r.home): {},
 awayScore = games[i].linescore ?jQuery.parseJSON(games[i].linescore.r.away) : {};

印第安人vs红袜队-进步球场似乎没有线得分值。先检查一下。您还可以在回调中使用迭代器和值参数,而不是递增
i

喂得好

var mlb='1〕http://mlb.mlb.com/gdcross/components/game/mlb/year_2016/month_04/day_07/master_scoreboard.json';
$.ajax({
网址:mlb,
数据类型:“json”,
成功:功能(数据){
var games=data.data.games.games;
美元。每个(游戏、功能(i、v){
var home=v.home\u团队名称,
客场=客场球队名称,
地点,地点,
homeScore,
awayScore;
如果(v.linescore){
homeScore=v.linescore.r.home,
awayScore=v.linescore.r.away;
}否则{
homeScore=“不适用”,
awayScore=“不适用”;
}
$(“”+主场+”vs“+客场+”-“+Visite+”

”)。附录(“#记分板”); $(“”+homeScore+”-“+awayScore+”

”)。附录(“#记分板”); }); } });


codepen对我来说很好。@Juhana这是我的错,我更改了API拉取的日期,然后pen自动保存。如果可以,请再试一次。我把它改回了今天的日期,dbacks游戏应该不见了。这也让我想知道今天的JSON提要是否有问题,因为昨天根本不会抛出错误……这是真的。您可以使用
$。每个(游戏、函数(i、val){
不是通过
i++
实现
i
variable by
i++
Linescore在所有游戏中都绝对存在,我可以在JSON查看器工具中看到它。这就是为什么它如此令人沮丧的原因。使用您的建议也会破坏脚本。编辑:关于Linescore,您是对的。我没有注意到印第安人的游戏因此而推迟了谢谢!我想JSON查看器已经为您介绍了这个问题。实际上,您可以使用console.log(games[I])在Chrome控制台中登录此对象。在某些循环中找不到所需的linescore。非常感谢!我没有注意到今天游戏被推迟,因此可能会抛出错误。这是我第一次跳转到JSON对象中,我假设
I
index
v
是value?你会碰巧看到吗知道我在哪里可以找到一些文档来进一步学习吗?谢谢你在绝对正确的方向上的推动!是的,我在使用
v
I
方面非常一致。jQuery很有趣,因为它以非常规的顺序使用这些文档。Array.forEach正好相反。我记得我在想“jQ”尤里病得很厉害,需要静脉注射:)我会在阅读后回复你,这会有所帮助。你考虑过使用模板吗?这是一种非常干净的方法。我通常不使用canJs,但我用它来制作一个快速的客户端示例。你也可以使用nodeJs模板,比如express或marko。有很多关于这些的文档。谢谢r惊人的知识。我很早就开始了这个思考过程,所以模板和没有的东西是下一个列表。再次感谢。不客气。实际上很有趣,我昨晚学了一些CANJ。哦,还有一件事。我注意到当linescore只是一个对象时,它不再包装在数组中,这很奇怪,但我以前在数据中看到过feed。我没有检查,但我假设这就是问题的原因。您必须单独处理这种情况。检查jsbin链接(),您将在HTML模板中看到if/else if。具有
.length
属性的是数组,具有
属性的是对象。首先,我假设其余属性为空。