如何解析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
相关产品推荐
相关产品推荐

