JSON 从最后一个对象中删除尾随逗号

Posted

技术标签:

【中文标题】JSON 从最后一个对象中删除尾随逗号【英文标题】:JSON Remove trailiing comma from last object 【发布时间】:2016-03-24 11:54:41 【问题描述】:

这个 JSON 数据被动态插入到我正在处理的模板中。我正在尝试从对象列表中删除尾随逗号。

我正在使用的 CMS 使用 Velocity,我还不太熟悉。所以我想写一个 javascript 的 sn-p 来检测最后一个对象 (ITEM2) 上的尾随逗号并将其删除。是否有一个 REGEX 可以用来检测右括号之前的任何逗号?

[  
     
      "ITEM1":  
         "names":[  
            "nameA"
         ]
      
   ,
     
      "ITEM2":  
         "names":[  
            "nameB",
            "nameC"
         ]
      
   , // need to remove this comma!
]

【问题讨论】:

这不是合法的 JSON - 无论生成什么都需要修复。不解决这个问题只会为该输出的下一个用户增加技术债务。 ,\s*\] 应该这样做,但不关心字符串文字。 好的,谢谢。会的。 【参考方案1】:

你需要找到,,之后没有任何新的属性、对象或数组。 新属性可以以引号("')或任何单词字符(\w)开头。 新对象只能以字符 开头。 新数组只能以字符 [ 开头。 新的属性、对象或数组可以放在一堆类似空格的符号 (\s) 之后。

所以,正则表达式将是这样的:

let regex = /\,(?!\s*?[\\[\"\'\w])/g;

像这样使用它:

// javascript
let input; // this is the initial string of data
let correct = input.replace(regex, ''); // remove all trailing commas
let data = JSON.parse(correct); // build a new JSON object based on correct string

Try the first regex.


Another approach 是查找每一个,,之后有一个右括号。 在这种情况下,右括号是 ]。 同样,右括号可能放在一堆类似空格的符号 (\s) 之后。

因此是正则表达式:

let regex = /\,(?=\s*?[\\]])/g;

用法相同。

Try the second regex.

【讨论】:

这也替换了逗号的内部字符串,例如“字母”:“a,b,c”。以下仅检查尾随逗号: fix.replace(/(.*?),\s*(\|])/g, "$1$2");【参考方案2】:

对于您的具体示例,您可以像这样进行简单的搜索/替换:

,\n]$

替换字符串:

\n]

Working demo

代码

var re = /,\n]$/; 
var str = '[  \n     \n      "ITEM1":  \n         "names":[  \n            "nameA"\n         ]\n      \n   ,\n     \n      "ITEM2":  \n         "names":[  \n            "nameB",\n            "nameC"\n         ]\n      \n   ,\n]';
var subst = '\n]'; 

var result = str.replace(re, subst);

【讨论】:

【参考方案3】:

我为此目的开发了一个简单但有用的逻辑 - 你可以试试这个。

Integer Cnt = 5;
        String StrInput = "[";
        
        for(int i=1; i<Cnt; i++)
            StrInput +="   "  
                     + "     \"ITEM"+i+"\": " 
                     + "      \"names\":["  
                              + "   \"nameA\""
                                + "]"
                  +"";
                            
            if(i ==(Cnt-1))  
                StrInput += "";            
             else 
                StrInput += ",";
            
        
        
        StrInput +="]";
        
        System.out.println(StrInput);

【讨论】:

【参考方案4】:

考虑 Json 输入 = ["ITEM1":"names":["nameA"],"ITEM2":"names":["nameB","nameC"],]没有空格。 我建议使用 substring 的简单方法。

input = input.substring(0, input.length-2);
input = input + "]";

【讨论】:

以上是关于JSON 从最后一个对象中删除尾随逗号的主要内容,如果未能解决你的问题,请参考以下文章

tslint - 最后一行缺少尾随逗号(尾随逗号)

从使用 foreach 循环构造的 JSON 中删除最后一个逗号 [重复]

数组和对象中的尾随逗号是规范的一部分吗?

数组和对象中的尾随逗号是规范的一部分吗?

无论我是不是将尾随逗号放入数组中,性能是不是存在差异?

我应该在函数调用中的最后一个参数后添加一个尾随逗号吗?