CloudGamingAdmin/admin-server/CloudGaming.Core.AgileConfig/DictionaryConvertToJson.cs
2024-11-15 02:58:48 +08:00

159 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<string, string> dict)
{
if (dict.Count == 0)
{
return "{}";
}
var root = new SortedDictionary<string, object>();
foreach (var kv in dict)
{
Generate(kv.Key, kv.Value, root);
}
var newDict = RebuildDict(root);
return JsonConvert.SerializeObject(newDict, Formatting.Indented);
}
/// <summary>
/// 判断字典是否符合json数组的格式
/// </summary>
/// <param name="dict"></param>
/// <returns></returns>
private static bool JudgeDictIsJsonArray(IDictionary<string, object> 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;
}
/// <summary>
/// 把字典转成Array
/// </summary>
/// <param name="dict"></param>
/// <returns></returns>
private static object[] ConvertDictToJsonArray(IDictionary<string, object> 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;
}
/// <summary>
/// 重构字典如果有字典的值对应的是json的数组那么就把这个数组转成Array
/// </summary>
/// <param name="dictOrArray"></param>
/// <returns></returns>
private static object RebuildDict(object dictOrArray)
{
var dict = dictOrArray as IDictionary<string, object>;
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;
}
/// <summary>
/// 把扁平化的键值对还原成字典嵌套字典的模式
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="parent"></param>
private static void Generate(string key, string value, IDictionary<string, object> 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<string, object>;
if (son != null)
{
Generate(otherKeys, value, son);
}
}
else
{
var son = new SortedDictionary<string, object>();
Generate(otherKeys, value, son);
parent.Add(sonKey, son);
}
}
else
{
parent.Add(key, value);
}
}
}