JavaScript JSON解析

3
我正在处理这个JSON,尝试获取所有的键和值。我的问题是,在某些情况下,有更多的键和值的内部对象,
这可以仅使用JavaScript递归完成吗?我错过了什么吗?
{
  "@xmlns:v6": "urn://oracle.bi.webservices/v6",
  "v6:pageID": "?",
  "v6:reportID": "?",
  "v6:report": {
    "v6:reportPath": "?",
    "v6:reportXml": "?"
  },
  "v6:reportViewName": "?",
  "v6:reportParams": {
    "comment": [
      "Zero or more repetitions: ",
      "Zero or more repetitions: ",
      "Zero or more repetitions: ",
      "Zero or more repetitions: ",
      "Optional: "
    ],
    "v6:filterExpressions": "?",
    "v6:variables": {
      "v6:name": "?",
      "v6:value": "?"
    },
    "v6:nameValues": {
      "v6:name": "?",
      "v6:value": "?"
    },
    "v6:templateInfos": {
      "v6:templateForEach": "?",
      "v6:templateIterator": "?",
      "comment": "Zero or more repetitions: ",
      "v6:instance": {
        "v6:instanceName": "?",
        "comment": "Zero or more repetitions: ",
        "v6:nameValues": {
          "v6:name": "?",
          "v6:value": "?"
        }
      }
    },
    "v6:viewName": "?"
  },
  "v6:options": {
    "v6:enableDelayLoading": "?",
    "v6:linkMode": "?"
  },
  "v6:sessionID": "?"
}

这是我正在尝试处理的代码:

    function parse(data,child,parent){
    var nextRept = false;
        if(child){  
        for(var i = 0; i < tmp.parents.length ; i++){
            if(tmp.parents[i].name == parent){
                if(!tmp.parents[i].children)
                    tmp.parents[i].children = [];
                var keys = Object.keys(data);
                for (var k = 0; k < keys.length; k++) {
                var val = data[keys[k]];
                if(typeof val === 'object')
                {
                 tmp.parents.push({name: keys[k].replace("v6:","")} ); //adding the parent
                 parse(val,true,keys[k].replace("v6:","")); // adding children recursively 
                }
                if(val == '?')
                { // handle valid param
                    var attr = false;
                    if(keys[k].indexOf('@') == 0){
                        attr = true;
                        keys[k] = keys[k].replace("@","");
                    }
                    tmp.parents[i].children.push({name: keys[k].replace("v6:","") , value : val , isAttr : attr , isRepet : nextRept});
                    isRepet = false;
                }
                }
                return;
            }

        }
            return;
        }

        var keys = Object.keys(data);
        for (var i = 0; i < keys.length; i++) {
            var val = data[keys[i]];
            if(typeof val === 'object')
                {
                 tmp.parents.push({name: keys[i].replace("v6:","")} ); //adding the parent
                 parse(val,true,keys[i].replace("v6:","")); // adding children recursively 
                }
                else{

                if(val.indexOf('Zero or more repetitions') != -1){
                    nextRept = true;
                    continue;
                }
                if(val == '?')
                { // handle valid param
                    var attr = false;
                    if(keys[i].indexOf('@') == 0){
                        attr = "true";
                        keys[i] = keys[i].replace("@","");
                    }
                    else{
                        attr = false;
                    }
                    tmp.parents.push({name: keys[i].replace("v6:","").replace("@","") , value : val , isAttr : attr , isRepet : nextRept});
                    isRepet = false;
                }


                }
            }

    };

3
你缺少了...代码。你到目前为止尝试了什么? - MaxArt
1
我已经添加了一个小的代码示例(尚未包含递归解决方案)。 - JAisONE
你是否在处理某些要求,禁止使用递归?再次问一遍,你想做什么?请用语言描述,而不仅仅是代码。 - JLRishe
1
我正在尝试将所有这些JSON转换为具有相同层次结构的数组,这意味着,如果它有子元素,它们将在子数组中,依此类推。 - JAisONE
1
我还添加了我目前正在使用的完整解析代码,它只能工作一半...如果层次变得很深(包含数组等对象),递归就不会那么好:/ - JAisONE
显示剩余2条评论
1个回答

2

我很快写了这篇文章,但它应该适用于这种情况。(对象/数组/字符串的迭代)。

var obj = {
    "item":     "value",
    "item2":    ["value1","value2","value3"],
    "item3":    {"item3-1": ["item3-1-1", "item3-1-2", "item3-1-3"], "item3-2": {"morestuff": ["morestuff1", "morestuff2","morestuff3"]}}
}

function parseObject(obj){
    for (var key in obj) {
      if (obj.hasOwnProperty(key)) {
        var item    = obj[key];
        if(typeof item == 'string'){
            console.log(key + ' -> ' + obj[key]);
        }else{
            console.log(key + ' -> ');
            parseObject(item);
        }
      }
    }
}

parseObject(obj);

结果为:

项目 -> 值 项目2 -> 0 -> 值1 1 -> 值2 2 -> 值3 项目3 -> 项目3-1 -> 0 -> 项目3-1-1 1 -> 项目3-1-2 2 -> 项目3-1-3 项目3-2 -> 更多内容 -> 0 -> 更多内容1 1 -> 更多内容2 2 -> 更多内容3


2
谢谢Shai!这给了我正确的思考方向! - JAisONE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接