繁体   English   中英

从 appsettings.json 中提取自定义数组 object

[英]Extracting custom object array from appsettings.json

我正在尝试将 appsettings 文件绑定到通用 class,但目前我不能 map List<object>值。

我有一个 appsettings.Development.json 层次结构,如下所示:

{
    "AppSettings":{
        "ApplicationName":"FOO"
        "MyValues":[
            {
                "Name":"Tryout1",
                "QuestionCount": 7
            },
            {
                "Name":"Tryout2"
                "SettingName":"ABCDEFG"
            }
        ]
    }
}

而我的通用 class 是这样的:

public class AppSettings
{
    public string ApplicationName {get;set;}
    public List<object> MyValues {get;set;}
}

当我使用下面的代码将此 appsettings.Development.json 绑定到通用 class 时,如下所示:

static ConfigurationHelper()
{
    var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile($"appsettings.{environmentName}.json")
        .Build();

    try
    {
        var tryout = config.Get(typeof(AppSettings));
    }
    catch (Exception ex)
    {

        throw ex;
    }
}

tryout变量的ApplicationName填充了值foo ,但MyValues只是一个空数组。

我还尝试使用object[]而不是List<object> ,此时它可以识别对象的数量,但所有元素的值都为null

我不希望MyValues数组被预定义,因为每个元素都可以并且将有不同的字段,我想让这个过程尽可能通用。 我怎样才能做到这一点?

所以,我找到了一种实现我的目标的方法,虽然不是那么简单但仍然非常简单:

首先,我必须像这样更改我的 appsettings.Development.json 文件:

{
    "AppSettings":{
        "ApplicationName":"FOO"
        "MyValues":[
            "Tryout1": {
                "Name":"Tryout1",
                "QuestionCount": 7
            },
            "Tryout2": {
                "Name":"Tryout2"
                "SettingName":"ABCDEFG"
            }
        ]
    }
}

进行此更改后,还需要对泛型类型进行另一次更改,如下所示:

public class AppSettings
{
    public string ApplicationName {get;set;}
    public Dictionary<string, CustomBaseClass> MyValues {get;set;}
    public List<object> _MyValues {get;set;}
}

public class CustomBaseClass
{
    public string Name { get; set; }
}

public class Tryout1 : CustomBaseClass
{
    public int QuestionCount {get;set;}
}

public class Tryout2 : CustomBaseClass
{
    public string SettingName {get;set;}
}

这个 base class 很重要,因为我们不能真正将 appsettings 绑定到 object,我们仍然需要一个 class。而 base class 可以帮助我们像这样绑定这些自定义值:

private static List<Type> CustomTypes = new List<Type> { typeof(Tryout1), typeof(Tryout2) };

static ConfigurationHelper()
{
    var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile($"appsettings.{environmentName}.json")
        .Build();

    try
    {
        AppSettings = config.Get<AppSettingsContainer>();

        foreach (var keyValuePair in AppSettings.MyValues)
        {
            var type = CustomTypes.Where(t => t.Name == keyValuePair.Key).FirstOrDefault();

            if (type != null)
            {
                var myValue = config.GetSection(string.Format("AppSettings:MyValues:{0}", keyValuePair.Key)).Get(type);

                if (job != null)
                {
                    AppSettings._MyValues.Add(myValue);
                }
            }
        }
    }
    catch (Exception ex)
    {

        throw ex;
    }
}

这应该可以解决这个问题,非常感谢andrewlock.net ,因为我从那里得到了最初的Dictionary<string, T>想法。

如何访问列表<object>来自 appsettings.Json?<div id="text_translate"><p> 在我的 appsettings.json 我有一个这样的字段</p><pre> "MyFields": [ { "name":"one", "type":"type1" "parameters":[{"key":"url","value":"myurl.com"}, {"key":"data","value":"mydata"}] }, { "name":"two", "type":"type2"... .. and so on } ]</pre><p> 我制作了一个具有以下属性的 class Myfield:</p><pre> public class MyField { [JsonProperty] public string? name { get; set; } [JsonProperty] public string? type { get; set; } [JsonProperty] public IDictionary<string,string>? parameters { get; set; } }</pre><p> 我正在尝试使用配置在另一个 class 中访问它,如下所示:</p><pre> //config is the configuration var myFields = config.GetSection("MyFields").Get<List<MyField>>();</pre><p> 问题是 myFields 结果是空的。 但是当我通过消除“参数”字段来做同样的事情时,它就像一个魅力。</p><p> 我知道这与匹配不当有关,但能得到一些帮助会很棒。</p></div></object>

[英]How can I access a List<object> from appsettings.Json?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何访问列表<object>来自 appsettings.Json?<div id="text_translate"><p> 在我的 appsettings.json 我有一个这样的字段</p><pre> "MyFields": [ { "name":"one", "type":"type1" "parameters":[{"key":"url","value":"myurl.com"}, {"key":"data","value":"mydata"}] }, { "name":"two", "type":"type2"... .. and so on } ]</pre><p> 我制作了一个具有以下属性的 class Myfield:</p><pre> public class MyField { [JsonProperty] public string? name { get; set; } [JsonProperty] public string? type { get; set; } [JsonProperty] public IDictionary<string,string>? parameters { get; set; } }</pre><p> 我正在尝试使用配置在另一个 class 中访问它,如下所示:</p><pre> //config is the configuration var myFields = config.GetSection("MyFields").Get<List<MyField>>();</pre><p> 问题是 myFields 结果是空的。 但是当我通过消除“参数”字段来做同样的事情时,它就像一个魅力。</p><p> 我知道这与匹配不当有关,但能得到一些帮助会很棒。</p></div></object> 为 appsettings.json 编写自定义转换器 如何使用值数组读取appsettings.json 如何在appSettings.json中读取字符串数组? 使用ApplicationDbContext和来自appsettings.json的DI 从appSettings.json获取价值? 从不同的项目访问appsettings.json 从 appsettings.json 获取值 从 appSettings.json 配置 Serilog 的问题 如何从 appsettings.json 获取日期时间?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM