JSONUtils.java 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package com.tzld.piaoquan.longarticle.utils;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.google.common.reflect.TypeToken;
  4. import com.google.gson.GsonBuilder;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.apache.commons.lang3.StringUtils;
  7. @Slf4j
  8. public class JSONUtils {
  9. public static String toJsonNew(Object obj) {
  10. if (obj == null) {
  11. return "";
  12. }
  13. try {
  14. return JSONObject.toJSONString(obj);
  15. } catch (Exception e) {
  16. log.error("toJson exception", e);
  17. return "";
  18. }
  19. }
  20. public static String toJson(Object obj) {
  21. if (obj == null) {
  22. return "";
  23. }
  24. try {
  25. return new GsonBuilder().disableHtmlEscaping().create().toJson(obj);
  26. } catch (Exception e) {
  27. log.error("toJson exception", e);
  28. return "";
  29. }
  30. }
  31. public static <T> T fromJson(String value, TypeToken<T> typeToken, T defaultValue) {
  32. if (StringUtils.isBlank(value)) {
  33. return defaultValue;
  34. }
  35. try {
  36. return JSONObject.parseObject(value, typeToken.getType());
  37. } catch (Exception e) {
  38. log.error("parseObject error! value=[{}]", value, e);
  39. }
  40. return defaultValue;
  41. }
  42. /**
  43. * 解析AI返回的JSON内容,自动处理markdown代码块包裹的情况
  44. * AI返回的内容可能被 ```json ... ``` 包裹,导致直接解析失败
  45. */
  46. public static JSONObject parseAIJsonContent(String content) {
  47. if (StringUtils.isBlank(content)) {
  48. return null;
  49. }
  50. // 先直接尝试解析
  51. try {
  52. return JSONObject.parseObject(content);
  53. } catch (Exception e) {
  54. log.warn("JSON直接解析失败,尝试清理markdown格式后重试, content=[{}]", content);
  55. }
  56. // 清理markdown代码块标记后重试
  57. String cleaned = cleanMarkdownJsonBlock(content);
  58. try {
  59. return JSONObject.parseObject(cleaned);
  60. } catch (Exception e) {
  61. log.error("清理markdown格式后JSON解析仍然失败, cleaned=[{}]", cleaned, e);
  62. return null;
  63. }
  64. }
  65. /**
  66. * 清理markdown代码块标记,如 ```json ... ```
  67. */
  68. public static String cleanMarkdownJsonBlock(String content) {
  69. if (StringUtils.isBlank(content)) {
  70. return content;
  71. }
  72. String cleaned = content.trim();
  73. // 去除开头的 ```json 或 ```
  74. cleaned = cleaned.replaceAll("^```(?:json)?\\s*", "");
  75. // 去除结尾的 ```
  76. cleaned = cleaned.replaceAll("\\s*```$", "");
  77. return cleaned.trim();
  78. }
  79. }