using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CloudGaming.Core.AgileConfig; public class DictionaryConvertToJson { public static string ToJson(IDictionary dict) { if (dict.Count == 0) { return "{}"; } var root = new SortedDictionary(); foreach (var kv in dict) { Generate(kv.Key, kv.Value, root); } var newDict = RebuildDict(root); return JsonConvert.SerializeObject(newDict, Formatting.Indented); } /// /// 判断字典是否符合json数组的格式 /// /// /// private static bool JudgeDictIsJsonArray(IDictionary dict) { //从0号index开始测试这个字典的key值是否存在 //如果全部存在那么就是数组 var keys = dict.Keys; for (int i = 0; i < keys.Count; i++) { var key = i.ToString(); if (!dict.ContainsKey(key)) { return false; } } return true; } /// /// 把字典转成Array /// /// /// private static object[] ConvertDictToJsonArray(IDictionary dict) { var keys = dict.Keys; var array = new object[keys.Count()]; for (int i = 0; i < keys.Count(); i++) { var key = i.ToString(); array[i] = dict[key]; } return array; } /// /// 重构字典,如果有字典的值对应的是json的数组,那么就把这个数组转成Array /// /// /// private static object RebuildDict(object dictOrArray) { var dict = dictOrArray as IDictionary; if (dict != null) { if (JudgeDictIsJsonArray(dict)) { object array = ConvertDictToJsonArray(dict); array = RebuildDict(array); return array; } else { var keys = dict.Keys.Select(x => x).ToList(); foreach (var key in keys) { var val = dict[key]; dict[key] = RebuildDict(val); } return dict; } } var jsonArray = dictOrArray as object[]; if (jsonArray != null) { for (int i = 0; i < jsonArray.Length; i++) { jsonArray[i] = RebuildDict(jsonArray[i]); } return jsonArray; } return dictOrArray; } /// /// 把扁平化的键值对还原成字典嵌套字典的模式 /// /// /// /// private static void Generate(string key, string value, IDictionary parent) { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); } var groupArr = key.Split(':'); if (groupArr.Length > 1) { var sonKey = groupArr[0]; var newArr = new string[groupArr.Length - 1]; for (int i = 1; i < groupArr.Length; i++) { newArr[i - 1] = groupArr[i]; } var otherKeys = string.Join(':', newArr); if (parent.ContainsKey(sonKey)) { //如果已经有子字典 var son = parent[sonKey] as IDictionary; if (son != null) { Generate(otherKeys, value, son); } } else { var son = new SortedDictionary(); Generate(otherKeys, value, son); parent.Add(sonKey, son); } } else { parent.Add(key, value); } } }