2011-04-27 123 views
0

由于我正在进行的AJAX调用,我无法访问作为JSON从服务器端脚本接收的对象中的某些属性。根据对象本身的数据,我的JSON数据可以有两种形式。JavaScript对象迭代

表1:

 "MY_OBJ" : { "FILE" : "myfile.txt", 
     "PARAMS" : { "PARAM" : { "KEY" : "mykey", 
       "VALUE" : "myvalue" 
       } } 
      } 

表2:

 "MY_OBJ" : { "FILE" : "myfile.txt", 
     "PARAMS" : { "PARAM" : [ { "KEY" : "mykeyone", 
        "VALUE" : "myvalueone" 
       }, 
       { "KEY" : "mykeytwo", 
        "VALUE" : "myvaluetwo" 
       } 
       ] } 
      } 

这是我当前如何试图解析的数据在浏览器中显示:

function(v) { 
var myFormattedData = v.FILE; 
if (v.PARAMS !== undefined && v.PARAMS.PARAM !== undefined && v.PARAMS.PARAM.KEY !== undefined && v.PARAMS.PARAM.VALUE !== undefined) { 
    myFormattedData += '<br />' + v.PARAMS.PARAM.KEY + ' : ' + v.PARAMS.PARAM.VALUE; 
} } 

这种方法当我的数据在表单1中工作正常。在这种情况下,我将在浏览器中得到输出,如...

myfile.txt 
mykey : myvalue 

......这正是我想要的。

然而,当数据在表格2我得到的是这样的浏览器中显示的文件名...

myfile.txt 

...但我想获得的东西等等。 ..

myfile.txt 
mykeyone : myvalueone 
mykeytwo : myvaluetwo 

我需要能够处理获取这两种形式的数据。更糟糕的是,我可能还应该计划在未来的某个时间点接收超过一个或两个键值对的可能性。我一直在为此奋斗很长一段时间。任何帮助深表感谢!

谢谢!

回答

0

尝试做这样的事情对于第二种形式:

for(i=0;i<v.PARAMS.PARAM.length;i++) { 
    myFormattedData += '<br />' + v.PARAMS.PARAM[i].KEY + ' : ' + v.PARAMS.PARAM[i].VALUE; 
} 
+0

我收到了很好的答案!我以各种形式尝试了其中的几种。我决定采取什么措施,以及现在对我最好的工作,以及让我为未来的其他键值对做准备,是检查Object.prototype.toString.call(v.PARAMS.PARAM) ===基于@Felix Kling评论的“[object Array]”。当它返回true时,我运行你的(Anthony Accioly)循环。当它返回false时,我只运行myFormattedData + ='
'+ v.PARAMS.PARAM.KEY +':'+ v.PARAMS.PARAM.VALUE;'。谢谢! – bgw 2011-04-27 18:39:35

0

在form1中,v.PARAMS.PARAM.KEY将为非null。

在表格2中,它将为空。
在这种情况下,你需要引用您的密钥和值v.PARAMS.PARAM[0].KEYv.PARAMS.PARAM[0].VALUEv.PARAMS.PARAM[1].KEY

0

在第二个版本,v.PARAMS.PARAM是一个数组。你应该检查它是否是一个Array,然后迭代该Array。下面的代码只适用于表单2.如果可能从服务器返回任何一种表单,则需要将您的功能与我展示的内容混合。

function(v) 
{ 
    var myFormattedData = v.FILE; 
    if(v.PARAMS !== undefined && v.PARAMS.PARAM !== undefined && v.PARAMS.PARAM instanceof Array) 
    { 
     var l = v.PARAMS.PARAM.length, 
      current; 
     for(var i = 0; i < l; i++) 
     { 
      current = v.PARAMS.PARAM[i]; 
      if(current.KEY !== undefined && current.VALUE !== undefined) 
      { 
       myFormattedData += '<br />' + current.KEY + ' : ' + current.VALUE; 
      } 
     } 
    } 
} 
4

为了简化处理,请检查PARAM对象的类型。如果它是一个数组,那么你有类型2的响应。否则它是类型1的响应。通过在数组中包含PARAM将类型1转换为类型2,进一步简化,因此可以将所有内容视为客户端上的数组无论服务器如何发送它。

function(data) { 
    var params = data.PARAMS.PARAM; 
    if (!(params instanceof Array)) { 
     // convert to Array to treat everything alike 
     params = [ params ]; 
    } 
    // now that we know we are always dealing with an array, 
    // loop through each item and print each key, value pair 
    params.forEach(function(param) { 
     console.log(param.KEY + ": " + param.VALUE); 
    }); 
} 
+0

+1我的想法:)替代(更复杂)阵列检测器:'Object.prototype.toString.call(PARAMS)== =“[object Array]” – 2011-04-27 16:37:48

+0

谢谢Felix。我在几个地方看到过这种类型的检测。这是因为与IE兼容吗? – Anurag 2011-04-27 16:44:27

+0

我问自己同样的问题,因为我不知道了为什么*这是经常使用,而不是'instanceof数组''。我google了一下,但发现只有这个:http://javascript.info/tutorial/type-detection此刻我不能说更多,对不起。 – 2011-04-27 16:52:31