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

如何解析JSON字符串为键值对 拼接合法INSERT插入SQL语句

实现方法

直接用Spring生态自带的Jackson JSON解析库把传入的JSON字符串拆成键值对,遍历后分别拼接字段名和字段值即可,注意区分值的类型做对应处理,字符串值要做转义避免SQL语法错误。

具体实现步骤

  • SpringBoot项目默认已经集成Jackson,不需要额外引入依赖,直接注入ObjectMapper实例即可使用
  • 把接收到的JSON字符串解析为LinkedHashMap,保证字段顺序和传入顺序一致
  • 遍历Map,分别收集字段名和处理后的值:
    • 空值直接拼接NULL
    • 数字、布尔类型值直接转字符串拼接,不需要加引号
    • 字符串类型值先把内部的单引号替换为两个单引号做转义,再用单引号包裹
  • 拼接最终的INSERT语句执行即可

完整改造后代码

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.*;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@RestController
public class TestConfigController {

    private final EntityManager em;
    private final ObjectMapper objectMapper;

    public TestConfigController(EntityManager em, ObjectMapper objectMapper) {
        this.em = em;
        this.objectMapper = objectMapper;
    }

    @PostMapping(value = "/config/test/{tableName}/{schemaName}")
    public String postValue(@RequestBody String values,
                            @PathVariable("tableName") String tableName,
                            @PathVariable("schemaName") String schemaName) throws Exception {
        // 解析JSON为有序键值对
        LinkedHashMap<String, Object> paramMap = objectMapper.readValue(values,
                new TypeReference<LinkedHashMap<String, Object>>() {});

        List<String> keyList = new ArrayList<>();
        List<String> valueList = new ArrayList<>();

        for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
            keyList.add(entry.getKey());
            Object val = entry.getValue();

            if (val == null) {
                valueList.add("NULL");
            } else if (val instanceof Number || val instanceof Boolean) {
                // 数字、布尔类型无需加引号
                valueList.add(val.toString());
            } else {
                // 字符串类型转义单引号后加单引号包裹
                String escapedStr = val.toString().replace("'", "''");
                valueList.add("'" + escapedStr + "'");
            }
        }

        String keyString = String.join(",", keyList);
        String valueString = String.join(",", valueList);
        // 表名和schema加反引号,避免关键字冲突
        String sql = String.format("INSERT INTO `%s`.`%s`(%s) VALUES(%s)",
                schemaName, tableName, keyString, valueString);

        Query query = em.createNativeQuery(sql);
        query.executeUpdate();
        return values;
    }
}

注意事项

直接拼接原生SQL存在SQL注入风险,生产环境使用必须加白名单校验:限制可传入的schema名、表名范围,同时校验传入的字段名是否为目标表的合法字段,禁止恶意拼接SQL语句。如果业务场景允许,优先使用预编译参数的方式实现插入,安全性更高。


传入给出的示例JSON时,最终生成的可执行SQL如下:

INSERT INTO `对应schema名`.`对应表名`(id,indexNummer,indexName,minVal,maxVal,indexWert) VALUES(23,4,'Gewichtung Alter Periode ohne Maßnahmen',51.0,85.0,1)

内容的提问来源于stack exchange,提问作者Doncarlito87

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:48:15