[英]Is there a built-in method to convert .NET Configuration to JSON?
將 JSON 轉換為配置很容易,例如
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
var configuration = new ConfigurationBuilder().AddJsonStream(stream).Build();
這給了你一個IConfigurationRoot
。
是否有一種相反的方法(最好是在 Microsoft.Extensions.Configuration 包之一中)?
上下文:我正在下載一堆Azure 應用程序配置設置,並希望將它們導出為 JSON。 Azure 門戶中提供了類似的功能,但我也想解析密鑰保管庫引用。
我可能可以做這樣的事情:
// Convert to JSON
var jRoot = new JObject();
foreach (var setting in settings) {
Add(jRoot, setting.Key, setting.Value);
}
Add
方法定義為
private void Add(JObject jObject, string key, string value) {
var index = key.IndexOf(':');
if (index == -1) {
jObject[key] = value;
return;
}
var prefix = key[..index];
if (!jObject.ContainsKey(prefix)) {
jObject[prefix] = new JObject();
}
Add((JObject)jObject[prefix], key[(index + 1)..], value);
}
我可能需要擴展它以支持數組,但我希望我不必重新發明輪子。
現在,我擴展了Add
方法以支持數組:
private void Add(JToken jToken, string key, string value) {
var components = key.Split(":", 3);
if (components.Length == 1) {
// Leaf node
if (jToken is JArray jArray_) {
jArray_.Add(value);
} else {
jToken[components[0]] = value;
}
return;
}
// Next level
JToken nextToken;
var nextTokenIsAnArray = int.TryParse(components[1], out _);
if (jToken is JArray jArray) {
var index = int.Parse(components[0]);
if (jArray.Count == index) {
nextToken = nextTokenIsAnArray ? new JArray() : (JToken)new JObject();
jArray.Add(nextToken);
} else {
nextToken = jArray[index];
}
} else {
nextToken = jToken[components[0]];
if (nextToken == null) {
nextToken = jToken[components[0]] = nextTokenIsAnArray ? new JArray() : (JToken)new JObject();
}
}
Add(nextToken, key[(components[0].Length + 1)..], value);
}
這對我有用,假設數組以正確的順序出現,例如
"Foo:0"
,值"Bar"
"Foo:1"
,值"Baz"
它被序列化為
{ "Foo": ["Bar", "Baz"] }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.