JsonFormatConverter.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package com.kingdee.eas.custom.webbeisen.utils;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. public class JsonFormatConverter {
  7. /**
  8. * 转换data数组内指定字段的格式
  9. * @param originalJson 原始JSON字符串(需为数组格式或包含data数组的对象)
  10. * @param targetFields 需要转换的字段集合(用户自定义)
  11. * @return 转换后的JSON字符串
  12. */
  13. public static String convertDataFields(String originalJson, List<String> targetFields) {
  14. // 解析原始JSON
  15. Object root = JSONObject.parse(originalJson);
  16. JSONArray dataArray = getRootDataArray(root);
  17. if (dataArray == null) {
  18. return originalJson; // 无data数组时直接返回原始数据
  19. }
  20. // 处理data数组内的所有元素
  21. for (int i = 0; i < dataArray.size(); i++) {
  22. Object item = dataArray.get(i);
  23. if (item instanceof JSONObject) {
  24. processJsonObject((JSONObject) item, targetFields);
  25. }
  26. }
  27. return dataArray.toJSONString();
  28. }
  29. /**
  30. * 获取根数据数组(兼容顶层为数组或包含data数组的对象)
  31. */
  32. private static JSONArray getRootDataArray(Object root) {
  33. if (root instanceof JSONArray) {
  34. return (JSONArray) root;
  35. } else if (root instanceof JSONObject) {
  36. return ((JSONObject) root).getJSONArray("data");
  37. }
  38. return null;
  39. }
  40. /**
  41. * 递归处理JSONObject,转换指定字段
  42. */
  43. private static void processJsonObject(JSONObject obj, List<String> targetFields) {
  44. // 处理当前对象中的目标字段
  45. for (String field : targetFields) {
  46. if (obj.containsKey(field)) {
  47. Object original = obj.get(field);
  48. if (original instanceof JSONArray) {
  49. // 将数组转换为键值对并直接添加到父对象
  50. convertArrayAndMerge(obj, field, (JSONArray) original);
  51. }
  52. }
  53. }
  54. // 递归处理子节点
  55. for (String key : obj.keySet()) {
  56. Object value = obj.get(key);
  57. if (value instanceof JSONObject) {
  58. processJsonObject((JSONObject) value, targetFields);
  59. } else if (value instanceof JSONArray) {
  60. processJsonArray((JSONArray) value, targetFields);
  61. }
  62. }
  63. }
  64. /**
  65. * 递归处理JSONArray,转换其中元素的指定字段
  66. */
  67. private static void processJsonArray(JSONArray array, List<String> targetFields) {
  68. for (int i = 0; i < array.size(); i++) {
  69. Object item = array.get(i);
  70. if (item instanceof JSONObject) {
  71. processJsonObject((JSONObject) item, targetFields);
  72. } else if (item instanceof JSONArray) {
  73. processJsonArray((JSONArray) item, targetFields);
  74. }
  75. }
  76. }
  77. /**
  78. * 将JSONArray转换为键值对并合并到父对象
  79. */
  80. private static void convertArrayAndMerge(JSONObject parent, String originalField, JSONArray array) {
  81. if (array == null) return;
  82. // 移除原始字段
  83. parent.remove(originalField);
  84. // 处理数组中的每个元素
  85. for (int i = 0; i < array.size(); i++) {
  86. Object item = array.get(i);
  87. if (item instanceof JSONObject) {
  88. JSONObject jsonItem = (JSONObject) item;
  89. String primaryKey = extractNameField(jsonItem);
  90. if (primaryKey != null) {
  91. // 创建一个不包含name字段的新对象
  92. JSONObject processedItem = new JSONObject(true);
  93. for (String key : jsonItem.keySet()) {
  94. if (!"name".equals(key)) {
  95. processedItem.put(key, jsonItem.get(key));
  96. }
  97. }
  98. // 直接将处理后的对象添加到父对象
  99. parent.put(primaryKey, processedItem);
  100. }
  101. }
  102. }
  103. }
  104. /**
  105. * 提取对象的name字段值
  106. */
  107. private static String extractNameField(JSONObject obj) {
  108. if (obj.containsKey("name")) {
  109. Object nameValue = obj.get("name");
  110. return nameValue != null ? nameValue.toString() : null;
  111. }
  112. return null;
  113. }
  114. public static void main(String[] args) {
  115. // 示例JSON数据
  116. String originalJson = "[\n" +
  117. " {\n" +
  118. " \"customField\": [\n" +
  119. " {\n" +
  120. " \"name\": \"key1\",\n" +
  121. " \"text\": \"\",\n" +
  122. " \"value\": null\n" +
  123. " },\n" +
  124. " {\n" +
  125. " \"name\": \"key2\",\n" +
  126. " \"downloadUrls\": null\n" +
  127. " }\n" +
  128. " ]\n" +
  129. " }\n" +
  130. "]";
  131. // 指定需要转换的字段
  132. List<String> targetFields = Arrays.asList("customField");
  133. // 执行转换
  134. String convertedJson = convertDataFields(originalJson, targetFields);
  135. System.out.println(convertedJson);
  136. }
  137. }