【问题标题】:Parse multidimensional JSON array using $.get AJAX使用 $.get AJAX 解析多维 JSON 数组
【发布时间】:2014-09-21 13:47:29
【问题描述】:

我有一个表单,用于查找数组并使用 AJAX 和 jQuery 返回结果。我有一个功能工作,但另一个没有,而且我敢肯定,在这一点上,我对过度分析和长时间的故障排除感到困惑。请让我知道我缺少什么。

基本的表单元素:

<form name="theForm">
<input id="userName" value="myName" />
<input id="sumID" value="9999999" />
<input type="submit" onClick="summonerLookUp();" />
</form>

基本数组:

{"myName": {
   "id": 9999999,
   "name": "myName",
   "profileIconId": 673,
   "revisionDate": 1406601264000,
   "summonerLevel": 26
}}

有效的 Javascript:

function summonerLookUp() {
    var ID = "";
    ID = $("#userName").val();
    setKey();
    if (ID !== "") {

        $.ajax({
            url: 'http://url-to-api',
            type: 'GET',
            dataType: 'json',
            data: {

            },
            success: function (json) {
                var userID = ID.replace(" ", "");

                userID = userID.toLowerCase().trim();

                summonerLevel = json[userID].summonerLevel;
                summonerID = json[userID].id;

                document.getElementById("sLevel").innerHTML            
                = summonerLevel;
                document.getElementById("sID").innerHTML 
                = summonerID;

            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("error getting Summoner data!");
            }
        });
    } else {
    }
}


退货:
召唤师等级:26
召唤师ID:9999999

现在,当我尝试访问以下数组中此用户 ID 的“页面”中的“名称”属性时:

{"9999999": {
   "pages": [
      {
         "masteries": [
            {
               "id": 4313,
               "rank": 2
            },
            {
               "id": 4121,
               "rank": 1
            },
            {
               "id": 4134,
               "rank": 3
            }
         ],
         "id": 41932694,
         "name": "Offense Main",
         "current": true
      },
      {
         "masteries": [
            {
               "id": 4123,
               "rank": 3
            },
            {
               "id": 4311,
               "rank": 1
            },
         ],
         "id": 41932698,
         "name": "Utility",
         "current": false
      },
      {
         "masteries": [
            {
               "id": 4143,
               "rank": 3
            },
            {
               "id": 4162,
               "rank": 1
            },
            {
               "id": 4131,
               "rank": 1
            }
         ],
         "id": 41932702,
         "name": "Offense",
         "current": false
      },
   ],
   "summonerId": 9999999
}}

使用以下内容,我没有得到预期的结果(即,进攻主线):

function masteriesLookUp() {
    var ID = "";
    ID = $("#sumID").val();
    setKey();
    if (ID !== "") {

        $.ajax({
            url: 'http://url-to-api',
            type: 'GET',
            dataType: 'json',
            data: {

            },
            success: function (json) {
                var userID = ID;

                summonerMastery = json[userID].pages;

                document.getElementById("sMastery").innerHTML 
                = summonerMastery;

            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("error getting Summoner data!");
            }
        });
    } else {
    }
}

这会返回:

[object Object],[object Object],[object Object],[object Object]

我确定有几个问题,但我特别怀疑以下行:

summonerMastery = json[userID].pages;

【问题讨论】:

  • 首先,这不是有效的 JSON(例如,第二个“masteries”对象末尾的额外逗号)。要获得名称,它看起来像 pages 是 JSON 对象的数组?因此,要获得第一个名称“Offense Main”,则应为 json[userID].pages[0].name,而要获得“Utility”,则应为 json[userID].pages[1].name,依此类推。
  • 对不起逗号,它是一个很长的数组,我把它修整了一点,我忘记了逗号。我想我明白你对如何访问这些项目的意思。我会试一试,让你知道它是怎么回事。我想我需要某种 foreach 循环来返回所有页面名称,因为我不会总是知道我要访问多少或哪个“页面”名称,对吗?
  • 是的,没错。 Pages 只是一个 JSON 对象数组,因此您可以对其进行迭代并从每个 page 对象中获取 name(或任何其他)属性。

标签: javascript jquery arrays ajax


【解决方案1】:

您可以通过以下方式获取页面名称

success: function (json) {
    var userID = ID;
    summonerMastery = json[userID].pages;

    for(var page in summonerMastery){
        document.getElementById("sMastery").innerHTML += summonerMastery[page].name+" ";
    }

}

编辑:

要检查特定的单词,你可以这样做

for(var page in summonerMastery){
    if(summonerMastery[page].name.toLowerCase().indexOf("offense") !== -1){
        // do your stuff here.
    }
}

编辑 2:

在您的HTML 中添加一个按钮(或在您的AJAX 调用的success 处理程序中动态创建一个按钮。)

<input type="button" id="check" data-info="" style="display:none;" value="Check" />

在你的 javascript 中

success: function (json) {
    var userID = ID;
    summonerMastery = json[userID].pages;
    var b = $("#check");
    b.data("info",summonerMastery);

    b.off('click').on('click',function(){
        var summonerMastery = $(this).data('info');
        for(var page in summonerMastery){
            if(summonerMastery[page].name.toLowerCase().indexOf("offense") !== -1){
                alert("Success");
            } else {
                alert("Failure");
            }
        }
    });
    b.css('display','block'); 
}

【讨论】:

  • 谢谢,您知道我如何检查document.getElementById("sMastery").innerHTML += summonerMastery[page].name+", "; 的结果以查找特定的单词或字符串吗?例如,如果我想检查返回的结果中是否包含“Offense”一词?
  • 我有点困惑。会是:for(var page in summonerMastery){ if(summonerMastery[page].name.toLowerCase().indexOf("offense") !== -1){ // do your stuff here. } } ---- 还是 ---- for(var page in summonerMastery){ if(summonerMastery[page].name.toLowerCase().indexOf("offense") !== -1){ document.getElementById("sMastery").innerHTML += summonerMastery[page].name+", "; } }?理想情况下,我想单击一个按钮来检查字符串中是否存在该单词。如果存在,则在屏幕上写成功,如果不存在,则写失败。
  • 尝试了一些东西,仍然不正确。任何帮助将不胜感激。
  • 这有点令人困惑。你能解释一下你到底想怎么锻炼吗?比如,你能提供一些场景吗?
  • 当然,在提取所有精通名称的第二个函数中,我想要一个按钮来搜索返回的结果中的字符串。例如,“123”。如果在返回结果中找到“123”,则在屏幕上打印成功消息,否则打印失败消息。一种基本的验证。
猜你喜欢
  • 2022-01-19
  • 2014-07-04
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2016-03-18
相关资源
最近更新 更多