簡體   English   中英

是否有將 .NET 配置轉換為 JSON 的內置方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM