例子:
sql:
INSERT INTO `global_route_lane_info_config` (`id`,`gmt_create`,`gmt_modified`,`creator`,`modifier`,`code`,`managers`,`is_deleted`) VALUES (24,1690938411000,1690938550000,'{"id":"xx1314","name":"谢x"}','{"id":"xx1314","name":"谢x"}','L_XX_YY','{"managers":[{"id":"yy1314","name":"金x"}]}',0);
结果:
{"id":24,"gmt_create":1690938411000,"gmt_modified":1690938550000,"creator":{"id":"xx1314","name":"谢x"},"modifier":{"id":"xx1314","name":"谢x"},"code":"L_XX_YY","managers":{"managers":[{"id":"yy1314","name":"金x"}]},"is_deleted":0}
代码
public static void f2(){
String str = "INSERT INTO `global_route_lane_info_config` (`id`,`gmt_create`,`gmt_modified`,`creator`,`modifier`,`code`,`managers`,`is_deleted`) VALUES (24,1690938411000,1690938550000,'{\"id\":\"xx1314\",\"name\":\"谢x\"}','{\"id\":\"xx1314\",\"name\":\"谢x\"}','L_XX_YY','{\"managers\":[{\"id\":\"yy1314\",\"name\":\"金x\"}]}',0)";
List<String> list = new ArrayList<>();
Pattern pattern = Pattern.compile("(?<=\\()[^\\)]+");
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
list.add(matcher.group());
}
String field;
String[] fArr = list.get(0).split(",");
List<String> fList = new ArrayList<>();
for (int i=0;i<fArr.length;i++){
fList.add(fArr[i].replace("`",""));
}
List<String> valueList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if(i%2 != 0){
valueList.add(list.get(i).replace("\'",""));
}
}
for(int i=0;i< valueList.size();i++){
String[] arr = valueList.get(i).split(",");
List<String> result = new ArrayList<>();
for(int j=0;j< arr.length;){
int m = 1;
String s = arr[j];
if(!s.contains("{")){
result.add(s);
}else {
long count1 = s.chars().filter(ch -> ch == '{').count();
long count2 = s.chars().filter(ch -> ch == '}').count();
if (count1==count2){
result.add(s);
}else {
boolean boo = true;
int num = 1;
String ss = arr[j];
while (boo){
if(j+num>=arr.length){
break;
}
String sss = arr[j+num];
ss = ss+","+sss;
count1 = count1+sss.chars().filter(ch -> ch == '{').count();
count2 = count2+sss.chars().filter(ch -> ch == '}').count();
if(count1==count2){
result.add(ss);
boo = false;
}
num++;
}
m+=num-1;
}
}
j+=m;
}
String jsonSt = "";
for (int y = 0; y < result.size(); y++) {
try {
Long intValue = Long.parseLong(result.get(y));
String json = "\""+fList.get(y)+"\":"+result.get(y)+",";
jsonSt = jsonSt + json;
System.out.println(json);
} catch (NumberFormatException e) {
String json;
if(result.get(y).startsWith("{")){
json = "\""+fList.get(y)+"\":"+result.get(y)+",";
}else {
json = "\""+fList.get(y)+"\":"+"\""+result.get(y)+"\",";
}
jsonSt = jsonSt + json;
System.out.println(json);
}
}
// 输出
System.out.println("{"+jsonSt.substring(0,jsonSt.length()-1)+"}");
System.out.println();
}
}
这种方法是以分块的方式进行的分割,可以解析普通数据以及json数据,但是无法对 ”信息一,信息二,信息三“ 这种数据进行处理,这本来是一个数据,却被分割成了三块(因为是以逗号进行分割),所以将代码进行第二轮改进,通过对每一个字符进行判断完成解析:
public static void f1(){
String str = "INSERT INTO `global_route_lane_info_config` (`id`,`gmt_create`,`gmt_modified`,`creator`,`modifier`,`code`,`managers`,`is_deleted`) VALUES (24,1690938411000,1690938550000,'{\"id\":\"xx1314\",\"name\":\"谢x\"}','{\"id\":\"xx1314\",\"name\":\"谢x\"}','L_XX_YY','{\"managers\":[{\"id\":\"yy1314\",\"name\":\"金x\"}]}',0)";
List<String> list = new ArrayList<>();
Pattern pattern = Pattern.compile("(?<=\\()[^\\)]+");
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
list.add(matcher.group());
}
String field;
String[] fArr = list.get(0).split(",");
List<String> fList = new ArrayList<>();
for (int i=0;i<fArr.length;i++){
fList.add(fArr[i].replace("`",""));
}
List<String> valueList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if(i%2 != 0){
valueList.add(list.get(i));
}
}
System.out.println(valueList);
for (String res : valueList) {
String s = res;
List<String> result = new ArrayList<>();
int n=0;
String ss = "";
// 首字母一定不是逗号
for(int i =0;i<s.length();i++){
if(res.charAt(i) != '\'){
ss += res.charAt(i);
}else {
n++;
}
if(((res.charAt(i) == ',') && (n==0 || n==2)) || i==s.length()-1){
result.add(ss);
ss = "";
n=0;
}
}
String jsonSt = "";
for (int y = 0; y < result.size(); y++) {
String sss = result.get(y);
if(sss.endsWith(",")){
sss = sss.substring(0,sss.length()-1);
}
try {
Long intValue = Long.parseLong(sss);
String json = "\""+fList.get(y)+"\":"+sss+",";
jsonSt = jsonSt + json;
System.out.println(json);
} catch (NumberFormatException e) {
String json;
if(sss.startsWith("{")){
// 这里因为要把引号拼上去,在这里展示的有点问题
json = "\""+fList.get(y)+"\":"+sss+",";
}else {
json = "\""+fList.get(y)+"\":"+"\""+sss+"\",";
}
jsonSt = jsonSt + json;
System.out.println(json);
}
}
// 输出
System.out.println("{"+jsonSt.substring(0,jsonSt.length()-1)+"}");
System.out.println();
}
}
实现原理:
1、观察sql,发现字段与值都是放在括号里的,所以直接将括号里的值单独截取出来,去除 不需要的sql关键字等数据。
2、将字段值取出,并去除 多余的符号,因为从数据库直接获取的sql都会带有 ’ 这个符号,所以需要去除。
3、对数据进行处理,观察sql,所有的数据都是放在 list 偶数位置上的,可以提取出来。
4、接下来就是对数值的特殊处理。
5、
第一种方法是直接通过逗号进行分割,如果是普通数据,则正好切割开,如果是json数据,则需要通过判断 { 和 } 的数量是否一致,如果是,则表示是完整的数据,但是 ”x,y,z“ 类型的数据会被分开,导致后面取值会造成 数据与字段匹配不上,所以使用第二种方法,通过对每一个字符进行判断
值也都是被符号 ’ 所包裹,所以每一对 ‘ 之内的就是完整的数据。如果是数据则没有符号 ‘ ,所以在遇到下一个逗号之前,符号’ 的数量为0或者2就代表是一组完整的数据