前幾天公司的用上了攜程的開源配置中心:Apollo
然后同事給我提了這么個問題,因為之前的時候我們用的都是.NET Core自帶的appsetting.json,為了兼容代碼的目前工具類中用來進行配置搜索的方法,需要把配置中心的key寫成【 父節點:子節點:子節點】的形式
問我有沒有什么好的辦法把現有的配置文件都轉成這樣的,不然手動copy太費勁了。
於是我想到了使用IConfiguration來進行json的操作,代碼如下:
通過IConfiguration來不斷的獲取下一個子節點然后遞歸返回
DirectoryInfo root = new DirectoryInfo(path); FileInfo[] files = root.GetFiles(); foreach (var file in files) { var builder = new ConfigurationBuilder().AddJsonFile(file.FullName); var config = builder.Build(); var first_chilren = config.GetChildren(); var key_value = Recursion(first_chilren, "", true); foreach (var item in key_value) { if (key_value_result.Any(x => x.key == item.key)) { continue; } key_value_result.Add(new DiffJson { key=item.key, value=item.value, file_name=file.Name }); } }
public static IEnumerable<Json> Recursion(IEnumerable<IConfigurationSection> section, string parent_key, bool is_first) { List<Json> result = new List<Json>(); foreach (var item in section) { var chiilren = item.GetChildren(); string currnet_key = ""; if (is_first) { currnet_key = $"{item.Key}"; } else { currnet_key = $"{parent_key}:{item.Key}"; } if (chiilren.Any()) { result.AddRange(Recursion(chiilren, currnet_key, false)); } if (!string.IsNullOrWhiteSpace(item.Value)) { result.Add(new Json { key = currnet_key, value = item.Value }); } } return result; }
最后返回效果: