导航栏: 首页 评论列表

处理JSON多余逗号

默认分类 2012-02-19 19:25:01

解决方案如下:

var json = {};  
json.removeExtComma = function (str) {  
  var i,  
    j,  
    len,  
    list,  
    c,  
    notValue = null,  
    preQuot = null,  
    lineNum;  

  list = String(str).split('');  
  for(i=0,len=list.length;i<len;i++){  
    c = list[i];  
    //单引或双引  
    if(/^[\'\"]$/.test(c)){  
      if( notValue === null && preQuot === null) {  
        notValue = false;  
        preQuot = i;  
        continue;  
      }  
      //值  
      if(!notValue){  
        //前面反斜杠个数  
        lineNum = 0;  
        for(j = i-1 ; j >-1 ;j --){  
          if(list[j] === '\\') {lineNum++;}  
          else { j=-1; }  
        }  
        //个数为偶数且和开始引号相同  
        //结束引号  
        if(lineNum % 2 === 0){  
          if(list[preQuot] === c) {  
            notValue = true;  
            preQuot = -1;  
          }  
        }  
      }  
      //非值  
      else {  
        //开始引号  
        if(preQuot == -1) {  
          preQuot = i;  
          notValue = false;  
        }  
        //结束引号  
        else if(list[preQuot] === c) {  
          notValue = true;  
          preQuot = -1;  
        }  
      }  
    }  
    //逗号  
    else if(c === ']' || c === '}'){  
      //非值  
      if(notValue){  
        for(j = i-1 ; j >-1 ;j --){  
          if(/^[\t\r\n\s ]+$/.test(list[j])) {continue;}  
          else { if(list[j] === ',') list[j] = ''; break;  }  
        }  
      }  
    }  
  }  
  return list.join('');  
}  

原创部分结束,以下部分转载自:http://heeroluo.net/ShowArticle84.aspx 多余的逗号

JSON

在JSON格式中,逗号是多个属性键值对间的分隔符,例如:

var json = { id: 1, name: 'heero' };

但在编程的时候,很容易会画蛇添足,在最后一对键值对后也加上了逗号:

var json = { id: 1, name: 'heero', };

在这种情况下,IE6、7会报错,但IE8以及其他浏览器则没有问题。

数组

在数组中,逗号是元素间的分隔符,例如:

var arr = [1, 2, 3];

同样地,我们也有可能不小心在最后一个元素后加了逗号:

var arr = [1, 2, 3,];

凭直觉来说,这应该是错误的语法。但实际上,所有浏览器都对这种情况实现了兼容,包括IE6。考虑这样一段示例代码:

var arr = [1, 2, 3,];
for (var i = 0; i < arr.length; i++) { alert(arr[i]); }

在IE以外的浏览器上,均依次输出1、2、3;但在IE浏览器上,却是依次输出1、2、3、undefined。明显地,IE在那个多余的逗号后加了一个undefined元素。

再考虑另一种情况,多余的逗号不在末尾,而是在中间:

var arr = [1, 2,, 3,];
for (var i = 0; i < arr.length; i++) { alert(arr[i]); }

所有浏览器均输出1、2、undefined、3,可见处理方式是一样的,就是在多余的逗号前插入一个undefined元素。


>> 留言评论