2012-07-17 41 views
1

所以我有,我已經成功地傳遞到JS這個JSON struture:如何在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中的每一步變化和選擇從零到約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 
          }) 

        }) 
       }) 
      }) 
     }) 
    }); 
+1

您正在嘗試訪問'PageOne',但您的示例具有'StepOne' ...是問題所在嗎? – 2012-07-17 09:11:41

+0

StepOne = PageOne? – Sllix 2012-07-17 09:12:06

+0

您確定pushData包含正確的JavaScript對象嗎? – Juri 2012-07-17 09:12:10

回答

2

它需要

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

+0

關於如何通過某種foreach或while(counter Tom 2012-07-17 09:29:34

+1

看看我的編輯。 – Christoph 2012-07-17 09:41:03

+0

像發條一樣工作,只需要研究它,以便我可以確定我目前正在提供什麼級別來提供正確的打印輸出。非常感謝! :D 對不起後期讚賞,但我去吃午飯;) – Tom 2012-07-17 10:36:22

1

除了在StepOne == PAGEONE問題:

的StepOne是一個數組,它保存一個對象。

這對我來說沒有意義,因爲在StepOne中應該只有一個步驟...... ......但那只是我。

所以你必須去:

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

等等...

+0

只是每一步都有幾個問題,所以我不得不找到一種方法將問題鏈接到每一步。將嘗試這個,看起來很有希望 – Tom 2012-07-17 09:19:22

+0

這太棒了:) – Tom 2012-07-17 09:21:46

+0

在這種情況下,你可能會考慮寫一個僞類似的函數:「對於每一步,對於步驟中的每個問題:current_question = Step [i];對於每個選項在current_question中,current_option = current_question [j]:write_list_item/write_checkbox(current_option)。 在現實生活中,可能會涉及更多一點,最後我會親自做一些遞歸,讓生活變得不那麼痛苦,但是如果你考慮一下樹中每個「節點」代表什麼,寫出函數來處理它們變得更容易。 – Norguard 2012-07-19 03:19:32