数日前にCtripのオープンソース・コンフィギュレーション・センターを過ごすために会社:アポロ
私たちは、.NETのコアがappsetting.json来ているとき前に、検索で構成ツールに使用する現在の方法のコードとの互換性のために、あなたがセンターを設定する必要があるため、その後、私の同僚は、私にそのような質問を与えました形式で書かれたキー、[親:子ノード:子ノード]
Q.私は、既存の構成ファイルへの良い方法は、これに変換していない、または手動であまりにも激しいコピーされています。
だから私は、JSONのオペレーションコードにIConfigurationを使用して考え、次のとおりです。
IConfigurationによって次の子ノードを取得し続け、その後、再帰的に戻ります
DirectoryInfoルート= 新しいDirectoryInfo(パス)。 FileInfo []ファイル =のroot.GetFiles()。 foreachの(VARのファイル内のファイル) { VARのビルダー= 新しいConfigurationBuilder()AddJsonFile(file.FullName)。 VaRの設定= builder.Build()。 VAR first_chilren = config.GetChildren()。 VaRの KEY_VALUE =再帰(first_chilren、"" 、真の); foreachの(VARのアイテムでKEY_VALUE) { 場合(key_value_result.Any(X => x.key == item.key)) { 続けます。 } key_value_result.Add(新しいDiffJson { キー = item.key、 値 = item.value、 FILE_NAME = file.Name })。 } }
パブリック 静的のIEnumerable <JSON>再帰(IEnumerableを<IConfigurationSection>セクション、列 PARENT_KEY、BOOL is_first) { リスト <JSON>結果= 新しいリスト<JSON> (); foreachの(VARの項目でセクション) { VAR chiilren = item.GetChildren()。 文字列 currnet_key = "" ; もし(is_first) { currnet_key = $ " {item.Key} "; } 他 { currnet_key = $ " {PARENT_KEY}:{item.Key} " ; } であれば(chiilren.Any()) { result.AddRange(再帰(chiilren、currnet_key、偽))。 } もし(!ストリング.IsNullOrWhiteSpace(item.Value)) { result.Add(新しいJSON { キー = currnet_key、 値= item.Value })。 } } 戻り値の結果; }
そして最後に効果を返します。