如何使用Java将SQL INSERT语句解析转换为JSON参数格式?
用Java解析SQL INSERT语句并转换为JSON格式
这个需求在日常数据处理中挺常见的,我来给你一步步实现这个功能,主要分为分割多段INSERT语句、提取字段与值、组装JSON这几个核心步骤,下面是具体的实现方案:
1. 准备依赖
我们需要用到JSON处理库,这里以Jackson为例(Gson的实现思路类似),先在你的项目中添加Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 用最新稳定版即可 --> </dependency>
2. 完整实现代码
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class SqlInsertToJsonConverter { public static void main(String[] args) { String sqlQuery = "INSERT INTO myTable (ID, CITY, STATE, LAT_N, LONG_W) VALUES " + "(13, 'Phoenix', 'AZ', 33, 112); |\r\n" + "INSERT INTO myTable (ID, CITY, STATE, LAT_N, LONG_W) VALUES " + "(44, 'Denver', 'CO', 40, 105); |\r\n" + "INSERT INTO myTable (ID, CITY, STATE, LAT_N, LONG_W) VALUES (55, 'Chicago', 'IL', 41, 87);"; try { List<String> jsonList = convertInsertToJson(sqlQuery); // 输出最终的JSON数组 ObjectMapper objectMapper = new ObjectMapper(); String finalJsonArray = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonList); System.out.println(finalJsonArray); } catch (JsonProcessingException e) { e.printStackTrace(); } } public static List<String> convertInsertToJson(String sqlQuery) throws JsonProcessingException { List<String> jsonResults = new ArrayList<>(); ObjectMapper objectMapper = new ObjectMapper(); // 1. 分割多个INSERT语句(按分隔符"|"分割,过滤无效内容) String[] insertStatements = sqlQuery.split("\\|"); Pattern insertPattern = Pattern.compile("INSERT INTO .*? \\((.*?)\\) VALUES \\((.*?)\\);", Pattern.DOTALL); for (String statement : insertStatements) { String trimmedStmt = statement.trim(); if (trimmedStmt.isEmpty() || !trimmedStmt.startsWith("INSERT")) { continue; } // 2. 用正则匹配字段和值 Matcher matcher = insertPattern.matcher(trimmedStmt); if (matcher.find()) { String fieldsStr = matcher.group(1); String valuesStr = matcher.group(2); // 3. 解析字段列表 String[] fields = fieldsStr.split(","); for (int i = 0; i < fields.length; i++) { fields[i] = fields[i].trim(); } // 4. 解析值列表,处理字符串的单引号 String[] values = valuesStr.split(","); for (int i = 0; i < values.length; i++) { String value = values[i].trim(); // 去掉字符串的单引号,数字类型保持原样 if (value.startsWith("'") && value.endsWith("'")) { values[i] = value.substring(1, value.length() - 1); } } // 5. 组装字段与值的Map Map<String, Object> dataMap = new HashMap<>(); for (int i = 0; i < fields.length; i++) { // 尝试把数字字符串转成Integer,非数字则保留字符串 try { dataMap.put(fields[i], Integer.parseInt(values[i])); } catch (NumberFormatException e) { dataMap.put(fields[i], values[i]); } } // 6. 转换为JSON字符串并加入结果列表 String jsonStr = objectMapper.writeValueAsString(dataMap); jsonResults.add(jsonStr); } } return jsonResults; } }
3. 代码关键点解释
- 分割语句:用
split("\\|")分割多段INSERT,因为|是正则特殊字符,所以需要转义;之后过滤掉空行和非INSERT开头的无效内容。 - 正则匹配:
INSERT INTO .*? \\((.*?)\\) VALUES \\((.*?)\\);这个正则用来捕获字段列表(分组1)和值列表(分组2),Pattern.DOTALL确保换行符也能被匹配。 - 值处理:去掉字符串值的单引号,同时尝试把数字字符串转成Integer类型,让JSON的类型更准确。
- JSON转换:用Jackson的
ObjectMapper把Map直接转成JSON字符串,最后把所有JSON对象收集成列表,再转成美观的JSON数组输出。
4. 注意事项
- 如果你的INSERT语句中值包含逗号(比如字符串
'New York, NY'),上面的split(",")会出错,这种情况需要更复杂的正则来分割值,比如用正则(?<!'),来匹配不在单引号内的逗号。 - 如果有日期、浮点数等其他类型,可以扩展类型转换的逻辑。
- 建议对输入的SQL语句做合法性校验,避免恶意或格式错误的SQL导致解析失败。
内容的提问来源于stack exchange,提问作者Learn Java
相关产品推荐
相关产品推荐

