2012-07-03 132 views
-1

我指的是有關JSON的遞歸許多站點如下jQuery的複雜JSON對象名稱

JavaScript recursion does not work properly
jQuery recursive iteration over objects

但大多要麼知道密鑰或使用知道鍵循環。如果鍵&的值都是字符串,例如{「firstname」:「lastname」} &,那麼函數(k,v)可以分別給出鍵&的值作爲k &v。

但在情況下,如果JSON對象是複雜&我們沒有什麼未來是關鍵的可以是任何例如在JSON1 & JSON2是關鍵之一,三個不同的,兩個JSON1由五個替代,六&十名JSON2響應。

JSON1

{ 
    "one": true, 
    "three": [ 
     "red", 
     "yellow", 
     [ 
      "blue", 
      "azure", 
      "cobalt", 
      "teal" 
     ], 
     "orange" 
    ], 
    "two": 19.5 
} 

JSON2

{ 
    "five": true, 
    "six": [ 
     "red", 
     "yellow", 
     [ 
      "blue", 
      "azure", 
      "cobalt", 
      "teal" 
     ], 
     "orange" 
    ], 
    "ten": 19.5 
} 

如果一些我們怎麼能知道密鑰名&然後比較這將是確定。更容易比較的鑰匙,對於此標記應該是工作在URL以下建議

Can jQuery provide the tag name?

但對於正常的JSON對象屬性標記名似乎並沒有工作。檢查firefox屬性,如text(),attr(),不會讓我tagName。我想要的是通過json對象循環(實際上我使用xml2json插件將xml轉換爲以上json格式)&比較鍵如果存在並執行操作。我知道在XML中你可以使用nodeName來做同樣的事情。我應該如何使用JSON對象來做同樣的事情。

+0

不過我不知道,我得到了這個問題,但也許你是不是在談論像JSON指針(又名XPath for JSON)?在這種情況下,也許[這個庫](http://goessner.net/articles/JsonPath/)可能會有所幫助? – raina77ow

+0

例如,如果您迭代具有行和單元格的html表格,則可以爲每個表格,每行和每個單元格寫入3個循環,但是如果每個單元格都有內部表格,該怎麼辦?然而在這裏,你知道有三個標籤table,row,&cell,但是如果JSON對象元素可以按照上面給出的JSON1&JSON2中的任何順序出現,並且你正在迭代它,那麼如何知道什麼是當前元素而不知道tagName。因此,如果JSON對象結構和元素(key,val)結構發生變化,我們如何才能知道當前哪個鍵以及它的子進程被處理了。 – user593029

+0

無論你的表有多少行和列。關鍵是它有_rows_和_columns_;所以你的迭代將永遠是兩層深的。 – raina77ow

回答

0

一個快速的解決方案是使用jQuery.parseJSON http://api.jquery.com/jQuery.parseJSON/

或者,你可以這樣做:

VAR OBJ = JSON。解析(JSON1);

JSON對象,但是,並非所有瀏覽器都支持,你可能要看看: https://github.com/douglascrockford/JSON-js/blob/master/json2.js

包括庫也不會改變你的代碼,因爲它使JSON對象全球(萬一瀏覽器不支持它)。

它需要你的JSON字符串,分析它,並把它轉換成一個OBJ 所以對於JSON1你會得到這樣的:

obj.one給你值=真

obj.two給你的值= [ 「紅色」, 「黃色」,[ 「藍」, 「天藍色」, 「鈷」, 「青色」], 「橙色」]

obj.three給你的值= 19.5

然後你可以遍歷obj屬性:

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) {   
     switch(prop){ 
     { 
      case "one": 
       //Do stuff here 
       break; 
      case "two": 
       //Do stuff here 
       break; 
      case "three": 
       //Do stuff here 
       break; 
     } 
    } 
} 

另外,使用obj [prop]會給你的值而不是名稱。例如,在循環過程如果遇到: 道具=「三國」

則:

OBJ [道具] = 19.5

+0

我認爲這將工作,但我們可以動態地做,而不使用開關的情況下,如果沒有使用點運算符例如obj.one或obj.two將工作如果我們知道所有組合,但如果我們不知道道具名稱本身,會怎麼樣。我們可以擁有可以使用索引訪問的所有屬性的數組..這是可能的,不知道會不會奇怪 – user593029

+0

你會把自己放在一個角落。您無法通過從JSON對象中獲取意外的鍵值來盲目摺疊項目。良好的代碼和設計實踐的關鍵是瞭解您的輸入並保持一致。 – sksallaj

+0

但是,我可以說你的JSON格式是一致的,所以我會得到關鍵字的位置而不是名稱。如果您知道每個JSON文件的第一個節點都是針對某些內容以及第二個和第三個節點的,那麼您可以簡單地對「for循環」進行計數,這可以讓您更接近您想要的內容。 – sksallaj

0

我不完全確定你在找什麼,但我會在這裏把它扔掉。

如果你使用諸如for (key in jsonObj) { ... }之類的東西,那麼你可以在不知道鍵名的情況下迭代對象。在循環中,key會給你當前的鍵名,jsonObj[key]會給你相應的值。

舉例來說,如果我們使用 「JSON1」 對象:

for(key in JSON1) 
{ 
    alert(key + ": " + JSON1[key]); 
} 

第一個警報顯示:one: true

我懷疑你也可以使這個遞歸訪問嵌套對象。

+0

我認爲這應該工作..謝謝許多。我嘗試了$ .each,但那不起作用..&給我正確的鍵它寧可給我編號0. – user593029

+0

最後,你將如何知道與該對象關聯的屬性的數量,例如,如果表的屬性寬度,高度可以訪問作爲table.width和table.height使用點訪問成員,但在我的情況下,我不知道哪個組合可以有,即它可以table.x table.y等我也不知道它的成員的名稱是X,Y或Z或什麼也沒有我怎麼能這樣做 – user593029