效果:
解析前:
解析后
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author yangjijia
* @version 1.0
* @date 2022/2/24 17:26
*/
public class JSONCustomMain {
Map<String, List> ans = new LinkedHashMap<>();
private static Pattern linePattern = Pattern.compile("_([a-z])");
private static final String whenTypeEmptyKey = "emptyKey";
public static void main(String[] args) throws Exception {
JSONCustomMain jsonCustomMain = new JSONCustomMain();
String json = "[{\"field\":\"field\",\"fields\":[{\"childrenField\":\"children\"},{\"childrenField1\":\"childrenField1\",\"childrenField2\":\"childrenField2\",\"childrenArray1\":[\"aaa\",\"bbb\",\"ccc\"],\"childrenArray2\":[{\"array1\":\"array1\"}]}]},{\"stringarray\":[\"string\",\"string\",\"string\"]}]";
jsonCustomMain.handleArrayData("","",JSON.parseArray(json),new LinkedHashMap<>());
System.out.println(JSON.toJSONString(jsonCustomMain.ans));
}
public void handleArrayData(String keyVal, String arrayName, JSONArray array, Map<String, String> rootData) {
String preKeyVal = keyVal;
if (array == null || CollectionUtils.isEmpty(array)) {
if (keyVal == null || "".equals(keyVal)) {
keyVal = whenTypeEmptyKey;
}
JSONObject record = new JSONObject();
record.putAll(rootData);
String key = lineToHump(keyVal);
List<JSONObject> list = Lists.newArrayList(record);
if (ans.containsKey(key)) {
ans.get(key).addAll(list);
} else {
ans.put(key, list);
}
return;
}
int len = array.size();
for (int i = 0; i < len; i++) {
JSONObject jsonObject = array.getJSONObject(i);
Map<String, String> data = new HashMap<>(rootData);
List<String> arrayKeys = Lists.newArrayList();
for (String key : jsonObject.keySet()) {
Object o = jsonObject.get(key);
if (!(o instanceof JSONArray)) {
if (data.containsKey(key)) {
key = arrayName + "_" + key;
}
data.put(key, String.valueOf(o));
} else {
arrayKeys.add(key);
}
}
if (CollectionUtils.isEmpty(arrayKeys)) {
handleArrayData(keyVal, "", null, data);
} else {
for (String arrayKey : arrayKeys) {
JSONArray jsonArray = jsonObject.getJSONArray(arrayKey);
int size = jsonArray.size();
if (size == 0) {
data.put(arrayKey, "");
handleArrayData(keyVal, arrayKey, null, data);
} else {
Object o = jsonArray.get(0);
if (!(o instanceof JSONObject)) {
data.put(arrayKey, StringUtils.join(jsonArray, ","));
handleArrayData(keyVal + "_" + arrayKey, arrayKey, null, data);
} else {
handleArrayData(keyVal + "_" + arrayKey, arrayKey, jsonArray, data);
}
}
}
}
}
}
/**
* 下划线转驼峰
*
* @param str
* @return
*/
private String lineToHump(String str) {
Matcher matcher = linePattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}
}