You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:54:51