2012-07-03 73 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