返回列表

处理JSON多余逗号

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

解决方案如下:

  1. var json = {};  
  2. json.removeExtComma = function (str) {  
  3.     var i,  
  4.         j,  
  5.         len,  
  6.         list,  
  7.         c,  
  8.         notValue = null,  
  9.         preQuot = null,  
  10.         lineNum;  
  11.       
  12.     list = String(str).split('');  
  13.     for(i=0,len=list.length;i<len;i++){  
  14.         c = list[i];  
  15.         //单引或双引  
  16.         if(/^[\'\"]$/.test(c)){  
  17.             if( notValue === null && preQuot === null) {  
  18.                 notValue = false;  
  19.                 preQuot = i;  
  20.                 continue;  
  21.             }  
  22.             //值  
  23.             if(!notValue){  
  24.                 //前面反斜杠个数  
  25.                 lineNum = 0;  
  26.                 for(j = i-1 ; j >-1 ;j --){  
  27.                     if(list[j] === '\\') {lineNum++;}  
  28.                     else { j=-1; }  
  29.                 }  
  30.                 //个数为偶数且和开始引号相同  
  31.                 //结束引号  
  32.                 if(lineNum % 2 === 0){  
  33.                     if(list[preQuot] === c) {  
  34.                         notValue = true;  
  35.                         preQuot = -1;  
  36.                     }  
  37.                 }  
  38.             }  
  39.             //非值  
  40.             else {  
  41.                 //开始引号  
  42.                 if(preQuot == -1) {  
  43.                     preQuot = i;  
  44.                     notValue = false;  
  45.                 }  
  46.                 //结束引号  
  47.                 else if(list[preQuot] === c) {  
  48.                     notValue = true;  
  49.                     preQuot = -1;  
  50.                 }  
  51.             }  
  52.         }  
  53.         //逗号  
  54.         else if(c === ']' || c === '}'){  
  55.             //非值  
  56.             if(notValue){  
  57.                 for(j = i-1 ; j >-1 ;j --){  
  58.                     if(/^[\t\r \s ]+$/.test(list[j])) {continue;}  
  59.                     else { if(list[j] === ',') list[j] = ''break;  }  
  60.                 }  
  61.             }  
  62.         }  
  63.     }  
  64.     return list.join('');  
  65. }  

转载: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元素。