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

如何正确拼接JSON生成合法格式?避免子JSON被额外引号包裹

解决JSON序列化重复导致的格式无效问题

你现在的核心问题是重复执行了JSON序列化操作,导致T1_DATA被当成普通字符串处理,最终出现多余引号破坏格式:

  1. 你先把outputMap.get(AI3Constants.T1_DATA)这个Java对象序列化成了JSON字符串
  2. 又把这个字符串(还错误截取了首尾的{})放进JSONObject
  3. 最后对整个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:33:34