【问题标题】:How to access nested JSON in JS?如何在 JS 中访问嵌套的 JSON?
【发布时间】:2012-07-17 09:09:19
【问题描述】:

所以我有这个我已经成功传递给 JS 的 JSON 结构:

{
"StepOne": [
    {
        "id": "2",
        "type": "1",
        "description": "How are you feeling?",
        "options": [
            {
                "opt_id": "1",
                "opt_desc": "Good"
            },
            {
                "opt_id": "2",
                "opt_desc": "Perfect"
            },
            .... etc

它一直持续到 PageFive,每个步骤的问题数量从 1 到 4 个不等,每个问题的选项从 null 到大约 10 个不等。我想使用这些信息在 Javascript 中生成多步骤表单,但我不知道如何访问内部数据。我只能找到“PageOne”、“PageTwo”等。我正在使用以下代码来执行此操作:

$(document).ready(function()
    {       
        $('#show-results').click(function() 
        {
            $.post('json.php', function(data) 
            {
                var pushedData = jQuery.parseJSON(data);


                $.each(pushedData, function(i, serverData)
                {
                    alert(i);
                })
            })
        })
    });

现在我已经尝试了这些函数来获取内部值:

var desc = pushedData.PageOne.description;

var desc = pushedData['PageOne']['Description'];

在每个循环中我都尝试过类似的东西

var desc = PageOne.description;

var desc = PageOne['description'];

这一切都以未定义的形式出现。有没有一种方法可以像遍历页面一样遍历每个页面中的每个问题?然后从那里冲洗并重复以迭代每个问题的选项?如果我可以访问每个级别,我应该准备好动态生成投票,这是这里的最终目标。

我认为这段代码有点意思(在我发布后立即发现)。虽然不太好用。

$(document).ready(function()
    {       
        $('#show-results').click(function() 
        {
            $.post('JSAAN.php', function(data) 
            {
                var pushedData = jQuery.parseJSON(data);

                $.each(pushedData, function(i, stepData)
                {
                    $.each(stepData, function(j, questionData)
                    {
                      // Print question here
                           $.each(questionData, function(k, optionData)
                           {
                                // Print option here
                           })

                    })
                })
            })
        })
    });

【问题讨论】:

  • 您正在尝试访问PageOne,但您的示例中有StepOne...是这个问题吗?
  • 您确定 pushData 包含正确的 JavaScript 对象吗?
  • 哦,哈哈,对不起@JamesAllardice :)
  • 哦,对不起,是的。我更改了示例的变量名称,因为我发现它最常被命名为多步骤而不是多页面。但这不是问题。我的坏
  • @Sllix 抱歉标签放错了 :) 感谢您的纠正。

标签: jquery json getjson


【解决方案1】:

应该是的

jsonData.StepOne[0].description

因为你有一个额外的 [] 数组包装器。

根据你的结构,省略额外的[],然后你可以直接访问所有的对象属性,它应该是这样的:

{
"StepOne":
    {
        properties
    },
"StepTwo":
    {
        properties
    }
}

不过,有这样的结构也没关系——现在你必须写StepOne[x].prop

"StepOne":[
    {
        properties
    },
    {
        other props
    }],
 "StepTwo":[{...

根据您发布的代码,这可能是您想要的,因为您每个步骤都有几个问题(?)。

简单的循环如下所示:

for (var key in o) {
  if (o.hasOwnProperty(key)) {
    console.log(key + " -> " + o[key]);
  }
}

嵌套循环更复杂:

function loop(obj) {
    $.each(obj, function(key, val) {
        if($.isPlainObject(val) || $.isArray(val)) {

            console.log(key + " is an Object");
            // object or array -> call recursively
            loop(val);

        } else {
           // plain value
           console.log(key + "->" + val);
        }
    });
}

看看this example

【讨论】:

  • 关于如何使用某种 foreach 或 while (counter
  • 像发条一样工作,只需要研究它,这样我就可以确定我目前处于什么级别,以提供正确的打印输出。非常感谢! :D 抱歉迟到了,但我去吃午饭了 ;)
  • if (key == "PageOne" || key == "PageTwo" || key == "PageThree" || key == "PageFour" || key == "PageFive" || key == "PageSix" || key == "PageSeven") { level++; document.write("
    级别 "+ 级别 +": " + key + "
    "); ::::::::::::::::::::::::::::::::::::::::: if (key == "id" ) { document.write(val + "
    ");知道为什么第一个有效但第二个无效?
  • 当然,id 是一片叶子,这就是为什么当你在 if 分支中进行检查时执行 else 分支的原因?
  • 天哪,我现在觉得自己很愚蠢。当然就是这样,哈哈。这是我第三次尝试进行这个该死的民意调查,前两次没有按预期工作,所以现在我很容易失明。多谢。让我的一天
【解决方案2】:

除了 StepOne !== PageOne 问题:

StepOne 是一个数组,其中包含一个对象。

这对我来说毫无意义,因为在 StepOne 中可能应该只有一步...... ...但那只是我。

所以你必须去:

jsonData.StepOne[0].description;
jsonData.StepOne[0].options[0].opt_desc;
jsonData.StepOne[0].options[1].opt_desc;

等等……

【讨论】:

  • 只是每个步骤都有几个问题,所以我必须想办法将问题链接到每个步骤。会试试这个,看起来很有希望
  • 在这种情况下,您可以考虑编写一个伪函数,如下所示:“对于每个步骤,对于步骤中的每个问题:current_question = Step[i];对于 current_question 中的每个选项,current_option = current_question[j]: write_list_item / write_checkbox (current_option)。在现实生活中,它可能会涉及更多,我个人最终会在那里进行一些递归,以减少生活的痛苦,但如果你考虑一下每个树中的“节点”表示,写出处理它们的函数变得更容易。
  • 我确实使用了递归,如上面的答案所示,只是努力跟踪我的计数变量。
猜你喜欢
  • 2017-07-19
  • 1970-01-01
  • 2018-12-27
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多