此JSON数据正在动态插入到我正在处理的模板中。我正在尝试从对象列表中删除尾随逗号。
我正在使用的CMS使用Velocity,我还不太熟悉。所以我希望编写一段JavaScript代码来检测最后一个对象(ITEM2)上的尾随逗号并将其删除。是否有一个REGEX,我可以用来检测任何逗号之前的逗号?
[
{
"ITEM1":{
"names":[
"nameA"
]
}
},
{
"ITEM2":{
"names":[
"nameB",
"nameC"
]
}
}, // need to remove this comma!
]
答案 0 :(得分:13)
您需要找到,
,之后没有任何新的属性,对象或数组
新属性可以使用引号("
或'
)或任何单词字符(\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
Another approach是查找每个,
,之后会有一个结束括号
在这种情况下,结束括号为}
和]
同样,关闭括号可能放在一堆类似空格的符号(\s
)之后。
因此正则表达式:
let regex = /\,(?=\s*?[\}\]])/g;
用法是一样的。
答案 1 :(得分:1)
对于您的具体示例,您可以像这样进行简单的搜索/替换:
,\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);
答案 2 :(得分:0)
我在速度模板中也遇到了同样的问题。
您声明对象是动态插入JSON中的。所以最有可能这应该是循环。所以你可以在循环结束时添加虚拟对象。
您的力度模板应如下所示:
{
"data": [
#foreach($Student in $listStudent)
{
"id" : "$Student.id"
"Name" : "$Student.name"
},
#end
{"_COMMENT":"THIS IS PLACED HERE JUST TO EGNORE TRAILING COMMA AT THE END OF LAST OBJECT",
"_COMMENT":"THIS OBJECT MUST IGNORE WHILE PARSING"
}
]
}
这个技巧的唯一缺点是你必须在客户端编写一些逻辑以避免在解析JSON对象时使用虚拟对象。
答案 3 :(得分:0)
我为此目的开发了一种简单但有用的逻辑-您可以尝试一下。
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 :(得分:0)
考虑 Json 输入 = [{"ITEM1":{"names":["nameA"]}},{"ITEM2":{"names":["nameB","nameC"]}},]没有空格。 我建议使用 substring 的简单方法。
input = input.substring(0, input.length-2);
input = input + "]";