前几天公司的用上了携程的开源配置中心: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; }
最后返回效果: