如何正确拼接JSON生成合法格式?避免子JSON被额外引号包裹
解决JSON序列化重复导致的格式无效问题
你现在的核心问题是重复执行了JSON序列化操作,导致T1_DATA被当成普通字符串处理,最终出现多余引号破坏格式:
- 你先把
outputMap.get(AI3Constants.T1_DATA)这个Java对象序列化成了JSON字符串 - 又把这个字符串(还错误截取了首尾的
{})放进JSONObject - 最后对整个
map序列化时,T1_DATA的字符串内容会被自动转义(加外层引号、转义内部引号),你手动去掉反斜杠后,内部引号和外层引号直接冲突,生成了非法JSON。
方案1:直接放入原对象(推荐)
既然outputMap.get(AI3Constants.T1_DATA)本身就是可序列化的Java对象(比如Map、List或自定义Bean),直接把它放进JSONObject,最后统一序列化即可,完全不需要提前转成字符串:
// 直接取原对象,跳过提前序列化的步骤 Object t1Data = outputMap.get(AI3Constants.T1_DATA); JSONObject map = new JSONObject(); map.put("T1_DATA", t1Data); map.put("VIN", "1GYKPMRK7PZ000965"); // 直接序列化整个map,不需要手动处理转义符 String finalJson = jackson.writeValueAsString(map); KafkaOutputProducer.getInstance().sendRecordToResistanceInputKafkaTopic(sessionId, finalJson);
这样Jackson会自动递归序列化T1_DATA对应的对象,生成合法的嵌套JSON,最终结果是:
{"VIN":"1GYKPMRK7PZ000965","T1_DATA":{"columns":["task_id","subtask_id", ...]}}
方案2:如果只能拿到JSON字符串(不推荐)
如果因为特殊原因,你只能拿到T1_DATA的JSON字符串,不要直接放进JSONObject,先把字符串解析回Java对象,再放入:
String json = jackson.writeValueAsString(outputMap.get(AI3Constants.T1_DATA)); // 把JSON字符串解析回可序列化的对象 Object t1Data = jackson.readValue(json, Object.class); JSONObject map = new JSONObject(); map.put("T1_DATA", t1Data); map.put("VIN", "1GYKPMRK7PZ000965"); String finalJson = jackson.writeValueAsString(map); KafkaOutputProducer.getInstance().sendRecordToResistanceInputKafkaTopic(sessionId, finalJson);
注意:你之前的substring(1, json.length() - 1)是错误操作——原json是完整的对象JSON(比如{"columns":[]}),截取后变成"columns":[],本身就不是合法的JSON片段,会导致后续解析失败,必须去掉这一步。
为什么之前的方法没用?
- 用LinkedHashMap/HashMap存储和JSONObject本质一样,只要你放的是字符串,序列化时还是会被当成普通字符串处理,依然会加外层引号
- 正则替换是治标不治本,转义是JSON序列化的正常逻辑,强行去掉反斜杠只会让内部引号和外层引号冲突,生成非法格式。
内容的提问来源于stack exchange,提问作者ruth
相关产品推荐
相关产品推荐

