Javascript 无法读取某些JSON对象的属性
我正在写一个简单的脚本,将通过MLB API显示美国职业棒球大联盟的得分。我正在拉入主记分板json文件并访问一些值。在我开始访问游戏的实际分数之前,一切都很顺利,这些分数是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,
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 byi++
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
属性的是数组,具有属性的是对象。首先,我假设其余属性为空。