package com.tzld.piaoquan.longarticle.utils; import com.alibaba.fastjson.JSONObject; import com.google.common.reflect.TypeToken; import com.google.gson.GsonBuilder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @Slf4j public class JSONUtils { public static String toJsonNew(Object obj) { if (obj == null) { return ""; } try { return JSONObject.toJSONString(obj); } catch (Exception e) { log.error("toJson exception", e); return ""; } } public static String toJson(Object obj) { if (obj == null) { return ""; } try { return new GsonBuilder().disableHtmlEscaping().create().toJson(obj); } catch (Exception e) { log.error("toJson exception", e); return ""; } } public static T fromJson(String value, TypeToken typeToken, T defaultValue) { if (StringUtils.isBlank(value)) { return defaultValue; } try { return JSONObject.parseObject(value, typeToken.getType()); } catch (Exception e) { log.error("parseObject error! value=[{}]", value, e); } return defaultValue; } /** * 解析AI返回的JSON内容,自动处理markdown代码块包裹的情况 * AI返回的内容可能被 ```json ... ``` 包裹,导致直接解析失败 */ public static JSONObject parseAIJsonContent(String content) { if (StringUtils.isBlank(content)) { return null; } // 先直接尝试解析 try { return JSONObject.parseObject(content); } catch (Exception e) { log.warn("JSON直接解析失败,尝试清理markdown格式后重试, content=[{}]", content); } // 清理markdown代码块标记后重试 String cleaned = cleanMarkdownJsonBlock(content); try { return JSONObject.parseObject(cleaned); } catch (Exception e) { log.error("清理markdown格式后JSON解析仍然失败, cleaned=[{}]", cleaned, e); return null; } } /** * 清理markdown代码块标记,如 ```json ... ``` */ public static String cleanMarkdownJsonBlock(String content) { if (StringUtils.isBlank(content)) { return content; } String cleaned = content.trim(); // 去除开头的 ```json 或 ``` cleaned = cleaned.replaceAll("^```(?:json)?\\s*", ""); // 去除结尾的 ``` cleaned = cleaned.replaceAll("\\s*```$", ""); return cleaned.trim(); } }