使用正则将RestTemplate返回的无引号原始JSON数组转为合法JSON数组
解决非标准类JSON格式转合法JSON的问题
我来帮你搞定这个问题!你拿到的是一种类JSON但不符合标准规范的格式——它用=代替了JSON的:,而且字符串类型的键和值都没加双引号,这也是你之前正则没生效的核心原因。
先分析下你之前的正则问题:
- 没有处理键和
=之间的空格(原始数据里是VALUE1 = 1,不是VALUE1:1); - 匹配范围没覆盖带空格的值(比如
high temp); - 没有把
=替换成:; - 正则语法细节问题(比如Java里
replaceAll不需要在正则末尾加g,全局替换是默认行为)。
分步解决方案(以Java为例)
我们可以通过多步正则替换来把非标准格式转换成合法JSON,步骤清晰且容易调试:
String rawData = "{ items = [ { VALUE1 = 1, VALUE2 = v1, VALUE3 = high temp, VALUE4 = null }, { VALUE1 = 1, VALUE2 = v1, VALUE3 = low temp, VALUE4 = null }, { VALUE1 = 1, VALUE2 = v1.1, VALUE3 = Not valid, VALUE4 = null } ] }"; // 1. 把键+等号的组合,替换为带引号的键+冒号 String step1 = rawData.replaceAll("(\\w+)\\s*=\\s*", "\"$1\": "); // 2. 给非数字、非null的字符串值添加双引号 // 排除null、整数、小数,只给纯文本/带空格的文本加引号 String step2 = step1.replaceAll("(?<=: )(?!null|-?\\d+(\\.\\d+)?)([a-zA-Z\\s.-]+)", "\"$1\""); // 3. 清理多余空格,让JSON格式更严谨(可选但推荐) String validJson = step2.replaceAll("\\s+,", ",").replaceAll(",\\s+}", "}"); // 输出合法JSON System.out.println(validJson);
每一步的作用说明
第一步替换键和等号:
正则(\w+)\s*=\s*会匹配所有类似VALUE1 =的结构,将其替换为"VALUE1":,解决键的引号问题和=转:的问题。第二步给值加引号:
这个正则做了精准匹配:(?<=: ):确保匹配的内容前面是:加空格(也就是值的位置);(?!null|-?\\d+(\\.\\d+)?):排除null、整数、小数这些不需要加引号的JSON值;([a-zA-Z\\s.-]+):匹配字母、空格、点、横杠组成的文本值,给它们加上双引号。
第三步清理空格:
处理值后面可能带的多余空格(比如"high temp" ,变成"high temp",),让最终的JSON更规范。
转换后的合法JSON结果
{ "items": [ { "VALUE1": 1, "VALUE2": "v1", "VALUE3": "high temp", "VALUE4": null }, { "VALUE1": 1, "VALUE2": "v1", "VALUE3": "low temp", "VALUE4": null }, { "VALUE1": 1, "VALUE2": "v1.1", "VALUE3": "Not valid", "VALUE4": null } ] }
如果你的数据后续出现其他特殊字符(比如值里包含引号、括号),可以再调整正则的匹配范围,但针对你当前提供的原始数据,这个方案完全可行。
内容的提问来源于stack exchange,提问作者ariana777
相关产品推荐
相关产品推荐

