记录一个将非标准的字符串转为JSON数组结构的操作:
最近有个场景,调用外部的方法,得到了一串字符串,结构如下:
[
type[company] {
"mc": "名称1",
"code": "001"
},
type[edge] {
"mc": "名称2",
"code": "002"
},
type[company] {
"mc": "名称3",
"code": "003"
},
type[edge] {
"mc": "名称4",
"code": "004"
},
type[company] {
"mc": "名称5",
"code": "005"
}
]
en...这结构,看着像JSON数组,但是又不是,因为是调的别人的接口,也不好改返回结果的格式。也查了好些文章,毫无所获,后来问了公司的项目经理大佬,告诉我他以前处理过这种类似的数据,思路就是将类JSON的数据通过正则匹配替换不规则的部分,构造成合法的JSON结构。有些不好理解,直接上代码:
public static void main(String[] args) {
//原字符串
String str = "[type[company]{\"mc\":\"名称1\",\"code\":\"001\"},type[edge]
{\"mc\":\"名称2\",\"code\":\"002\"},type[company]{\"mc\":\"名称
3\",\"code\":\"003\"},type[edge]{\"mc\":\"名称
4\",\"code\":\"004\"},type[company]{\"mc\":\"名称5\",
\"code\":\"005\"}]";
//正则:获取字符串中不符合JSON标准的部分
Pattern pattern = Pattern.compile("(type)(\\[.+?\\])\\{");
Matcher matcher = pattern.matcher(str);
//sbb用于存放替换后的字符串
StringBuffer sbb = new StringBuffer("");
//遍历匹配后的结果
while (matcher.find()) {
//将匹配到的内容转换为标准的JSON结构
String s = "{\"" + matcher.group(1) + "\":\"" + matcher.group(2) + "\",";
//把上次替换位置到这次匹配到的位置之间的字符串+转换后的标准json结构,一起追加到sbb中
matcher.appendReplacement(sbb, s);
}
//把最后一次匹配位置之后的字符串也追加到sbb中。
matcher.appendTail(sbb);
System.out.println("sbb = " + sbb);
}
输出结果:
sbb = [{"type":"[company]","mc":"名称1","code":"001"},{"type":"[edge]","mc":"名称2","code":"002"},{"type":"[company]","mc":"名称3","code":"003"},{"type":"[edge]","mc":"名称4","code":"004"},{"type":"[company]","mc":"名称5","code":"005"}]
格式化一下:
[{
"type": "[company]",
"mc": "名称1",
"code": "001"
}, {
"type": "[edge]",
"mc": "名称2",
"code": "002"
}, {
"type": "[company]",
"mc": "名称3",
"code": "003"
}, {
"type": "[edge]",
"mc": "名称4",
"code": "004"
}, {
"type": "[company]",
"mc": "名称5",
"code": "005"
}]
得到了标准的JSON数组结构,对JSON数组的操作就不赘述了,这个网上多的很。
不知道有没有遇到相似情况的,感觉应该很少吧。自己先记录下,毕竟万一以后再遇到了,到处都搜不到处理方式也是挺心累的。