JavaScript对象迭代

时间:2011-04-27 16:25:18

标签: javascript json

我无法访问作为JSON从服务器端脚本接收的对象中的某些属性,这是我正在进行的AJAX调用的结果。我的JSON数据可以采用两种形式之一,具体取决于对象本身的数据。

表格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

我需要能够处理两种形式的数据。更糟糕的是,我可能还应该计划在未来某个时间点接收超过一个或两个键值对的可能性。我一直在努力解决这个问题。非常感谢任何帮助!

谢谢!

4 个答案:

答案 0 :(得分: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);
    });
}

答案 1 :(得分:0)

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

在表单2中,它将为null 在这种情况下,您需要将您的键和值引用为v.PARAMS.PARAM[0].KEYv.PARAMS.PARAM[0].VALUE以及v.PARAMS.PARAM[1].KEY

答案 2 :(得分:0)

在第二个版本中,v.PARAMS.PARAM是一个数组。你应该检查它实际上是一个数组,然后迭代该数组。以下代码仅适用于表单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;
            }
        }
    }
}

答案 3 :(得分:0)

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

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