package com.pingan.ratelimit.config;
import com.alibaba.fastjson.JSON;
import java.awt.*;
import java.awt.print.Pageable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* 作用:
*
* @author anti
*/
public class ChangeJSON {
public static void main(String[] args) {
// 測試
Map<String, Object> container = new HashMap<>();
getMapData().forEach((key, value) -> {
Map<String, Object> data = change(new HashMap<>(), key, value);
merge(container, data);
});
// 將toString方法覆蓋,輸出想要的json格式
String json = jsonStyleFormat(container);
System.out.println(json);
}
/**
* 將toString方法覆蓋,輸出想要的json格式
*
* @param container 要格式化的的數據
*/
private static String jsonStyleFormat(Map<String, Object> container) {
String mapString = container.toString();
System.out.println(mapString);
return mapString.replaceAll("=", ":");
}
/**
* 多個map有相同的key進行合併
*
* @param container 裝載遍歷之後的數據
* @param data 要遍歷查看的數據
* @return 合併之後的數據
*/
private static Map<String, Object> merge(Map<String, Object> container, Map<String, Object> data) {
// 遍歷map中的數據
data.forEach((sonKey, sonValue) -> {
// 如果容器中包含了目前遍歷的key,就代表這個key已經存在,需要覆蓋處理
if (container.containsKey(sonKey)) {
// 獲取覆蓋之前的數據
Object oldValue = container.get(sonKey);
// 如果不是map,就不需要再次判斷了
if (!(sonValue instanceof Map)) {
return;
}
// 將新的合併的值放入容器
container.put(sonKey, merge((Map<String, Object>) sonValue, (Map<String, Object>) oldValue));
} else {
// 如果沒有衝突,直接存入map
container.put(sonKey, sonValue);
}
});
return container;
}
/**
* 根據"."的key進行解析成單獨的Map
*
* @param map 裝有解析數據的容器
* @param key 每一次截取的key
* @param value key對應的值
* @return 解析之後的map
*/
private static Map<String, Object> change(Map<String, Object> map, String key, Object value) {
// 判斷字符串是否有.號
if (key.contains(".")) {
// 只要有.號,就代表有子map
Map<String, Object> sonMap = new HashMap<>();
// 獲取第一個.的位置方便獲取key
int index = key.indexOf(".");
// 獲取第一個key
String firstKey = key.substring(0, index);
// 獲取了第一個key之後,剩下的單獨作爲key在存入map,+2是因爲+1是這個字符串的下一個
int beginIndex = key.indexOf(firstKey);
String sonKey = key.substring(beginIndex + firstKey.length() + 1);
// 將截取的第一個字符串重新裝配
map.put(firstKey, change(sonMap, sonKey, value));
} else {
// 沒有點號,代表只有一個
map.put(key, value);
}
return map;
}
/**
* 提供測試數據
*/
private static Map<String, Object> getMapData() {
Map<String, Object> map = new HashMap<>();
map.put("A", 1);
map.put("B.A", 2);
map.put("B.B", 3);
map.put("CC.D.E", 4);
map.put("CC.D.F", 5);
map.put("E.F.G.D.A", 51);
map.put("E.F.G.D.B", 52);
return map;
}
}