将JSON列表解析为对象

时间:2015-04-17 11:27:07

标签: javascript arrays json

我遇到了一些麻烦:

我需要将一些JSON列表的值放入一个单独的JSON对象中。我有一个包含数据行和JSON对象的JSON列表。我想遍历列表并将行映射到JSON中的不同对象。

第一个和最后一个元素是空的,然后有一些有限数量的名字,每个名字后跟一个无限数量的夫妻“日期”,“投票”(参见pastebin以便更好地理解)。

然后,我希望将列表中某个名称下的所有投票收集到JSON中的该对象。

我如何在javascript中做到这一点?我应该改变JSON的结构吗?

那是json:

{
    "materie": [
        {
            "elettrotecnica_ed_elettronica": {
                "voti": []
            }
        },

        {
            "lingua_e_letteratura_italiana": {
                "voti": []
            }
        },

        {
            "lingua_inglese": {
                "voti": []
            }
        },

        {
            "matematica_e_complementi_di_matematica": {
                "voti": []
            }
        },

        {
            "scienze_motorie_e_sportive": {
                "voti": []
            }
        },

        {
            "sistemi_automatici": {
                "voti": []
            }
        },

        {
            "storia": {
                "voti": []
            }
        },

        {
            "tecnologie_e_progettazione_di_sistemi_elettrici_ed_elettronici": {
                "voti": []
            }
        }
]
}

那就是数组:

[ '',
  'elettrotecnica ed elettronica',
  '10',
  '7½',
  '8½',
  '5',
  '9',
  '7',
  '4',
  '7-',
  '7+',
  '6',
  '7½',
  'lingua e letteratura italiana',
  '6½',
  '5+',
  '6',
  '7+',
  '5',
  '6½',
  'lingua inglese',
  '6+',
  '7',
  '7-',
  '7½',
  '7',
  '7+',
  'matematica e complementi di matematica',
  '4½',
  '9½',
  '7',
  '6½',
  '9',
  '7½',
  '4',
  '9',
  '7½',
  '7',
  '8',
  '8',
  'scienze motorie e sportive',
  '5',
  '7',
  '6',
  '9',
  '7',
  '10',
  '8',
  '10',
  '7',
  'sistemi automatici',
  '8',
  '8½',
  '10',
  '10',
  '8½',
  '9½',
  '10',
  '10',
  '10',
  '9-',
  'storia',
  '4',
  '6',
  '5½',
  'tecnologie e progettazione di sistemi elettrici ed elettronici',
  's',
  '7-',
  '7',
  '8',
  '8-',
  '7+',
  '7½',
  '6',
  '6',
  '8',
  '6+',
  '7-',
  '7-',
  '6',
  '7',
  '6',
  '8½',
  '' ]

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你只想解析包含名称和投票的数组,并将它们插入到javascript对象(JSON对象,无论如何)中。然后执行此操作的方法是迭代数组,如果您知道格式始终是name + date,则可以检查数组中的第一项是否为char,如果它是一个名称,则查找匹配来自JSON数组的对象,然后将所有值迭代到其中,直到找到另一个char项。下面的快速黑客,不是100%的循环正常运行,但你应该明白:

//a function to check for numbers
function isNumber(n) {
   return !isNaN(parseFloat(n)) && isFinite(n);
}   
function isEmpty(str) {
   return (!str || 0 === str.length);
}
var jsonObject //the object we're appending the values to in your example
var name
var i = 1 //ignore the first empty value
for( i < voteArray.length() ){
  //check if a number 
  if (!isNumber(voteArray[i].charAt(0)) )
    if ( isEmpty(voteArray[i])){
      //end of list, break.
      break;
    }
    name = voteArray[i];
    //parse next two values and check if number
    for( i < voteArray.length()){
        if(isNumber(voteArray[i+1]) && isNumber(voteArray[i+2])){
            //add the next numbers to JSON

            jsonObject[name].voti = //sum votes
            jsonOBject[name].date = //append date
            i=i+2 //increment i
        }
        else{
          if(isNumber(voteArray[i]){
            i = i+1;
            break;
          }else (isNumber(voteArray[i]){
            i = i+2;
            break;
          }
        }
    }
}

答案 1 :(得分:0)

您的阵列有点难以处理。这是一种解决方法,可以满足您的要求。但请注意,materia必须有超过2个字符且投票少于3个字符,否则将无法正常工作

var array = [ '',
  'elettrotecnica ed elettronica',
  '10',
  '7½',
  '8½',
  '5',
  '9',
  '7',
  '4',
  '7-',
  '7+',
  '6',
  '7½',
  'lingua e letteratura italiana',
  '6½',
  '5+',
  '6',
  '7+',
  '5',
  '6½',
  'lingua inglese',
  '6+',
  '7',
  '7-',
  '7½',
  '7',
  '7+',
  'matematica e complementi di matematica',
  '4½',
  '9½',
  '7',
  '6½',
  '9',
  '7½',
  '4',
  '9',
  '7½',
  '7',
  '8',
  '8',
  'scienze motorie e sportive',
  '5',
  '7',
  '6',
  '9',
  '7',
  '10',
  '8',
  '10',
  '7',
  'sistemi automatici',
  '8',
  '8½',
  '10',
  '10',
  '8½',
  '9½',
  '10',
  '10',
  '10',
  '9-',
  'storia',
  '4',
  '6',
  '5½',
  'tecnologie e progettazione di sistemi elettrici ed elettronici',
  's',
  '7-',
  '7',
  '8',
  '8-',
  '7+',
  '7½',
  '6',
  '6',
  '8',
  '6+',
  '7-',
  '7-',
  '6',
  '7',
  '6',
  '8½',
  '' ];

var jsonObj = {'materie':[]}
var i = -1;
var currentKey = '';
array.map(function(val){
  if (val.length > 0) {
    if (val.length > 2) {
      currentKey = val.replace(/\s/g,'_');
      var newObj = {};
      newObj[currentKey] = {voti:[]}
      jsonObj['materie'].push(newObj);
      i++;
    } else {
      jsonObj['materie'][i][currentKey]['voti'].push(val);
    }
  }
});

document.write(JSON.stringify(jsonObj));