【问题标题】:How to bind configuration to array of JSON Objects .Net Core如何将配置绑定到 JSON 对象数组 .Net Core
【发布时间】:2019-05-28 20:05:17
【问题描述】:

我正在尝试将 JSON 文件绑定到模型以用于 dotnet 核心项目中的配置设置。

json 看起来像:

"Settings": {
  "Values": [
  { "Value1": "1" },
  { "Value2": "2" }
]}

我的模型看起来像:

public class Settings
{
    public List<Value> Values{ get; set; }
}

public class Value
{
    public string Value1 { get; set; }

    public string Value2 { get; set; }
}

我绑定了以下内容:

var settings = _configuration.GetSection("Settings").Get<Settings>();

但这会导致settings 在列表中包含两个Value 对象-第一个Value 对象具有Value1 = 1Value2 = null,第二个Value 对象具有Value1 = nullValue2 = 2 .我怎样才能绑定这样它settingsValues 中只有一个Value 对象,同时填充了两个属性?

这与此处建议的不同: https://stackoverflow.com/questions/51488845/how-to-read-a-string-array-in-appsettings-json

这是因为在这种情况下,数组中的每个对象都有不同的属性,而在建议的副本中,所有对象都是一致的。

【问题讨论】:

  • 如果只需要一个Value对象,只定义一个Value对象:"Values": [ { "Value1": "1", "Value2": "2" } ]
  • Json 文件中的@EdPlunkett?
  • 是的。您现在得到的正是当前 JSON 所描述的内容。
  • @EdPlunkett - 有没有其他方法可以在不更改 JSON 的情况下实现这一目标?
  • 我猜你可以编写一些奇怪的代码来将列表压缩/合并/任何一个对象。你可以编写代码来做任何事情。它是怎么变成这样的?为什么要这样做?

标签: c# json .net-core configuration


【解决方案1】:

获取值的最简单方法可能是让你的类看起来像这样:

public class Settings
{
    public Dictionary<string, string>[] Values{ get; set; }
}

这将被解析为 Array of Dictionary 项目,其中每个项目将仅包含您的值的 1 个键值。

更新:

您可以在 Settings 类中添加一个函数,以将所有设置作为 1 个字典:

public Dictionary<string, string> GetSettings()
{
    var settingsValues = new Dictionary<string, string>();
    foreach (var valueDict in Values)
    {
        foreach (var setting in valueDict)
        {
            settingsValues.Add(setting.Key, setting.Value);
        }
    }
    return settingsValues;
}

【讨论】:

  • 那不是要在“Values”的内容周围加上花括号,而不是方括号吗?
  • 它是一个字典,它将是一个键值对象数组,所以它与问题中提到的这个JSON完全一样。
  • 我正在使用 Newtonsoft 进行测试。我应该如何测试?
  • 这会抛出{System.InvalidOperationException: Cannot create instance of type 'System.String' because it is missing a public parameterless constructor.
  • @MayerSpitzer 和 Ed Plunkett - 明白了!再次感谢您的帮助
【解决方案2】:

好的,所以它实际上需要看起来像:

public class Settings
{
    public List<Dictionary<string, string>> Values{ get; set; }
}

因为 JSON Values 实际上是一个字典数组。

为了以下工作:

public class Settings
{
    public Dictionary<string, string> Values{ get; set; }
}

JSON 需要如下所示:

"Settings": {
    "Values": {    
        "Value1": "1",
        "Value2": "2"
    }
}

【讨论】:

  • 你是对的,但我不知道为什么,因为在 JSON 中它只是一个KeyValuePair的数组
  • 但这不是一样的 - KeyValuePair 的数组是字典数组吗?但这并不容易发现 - 我今天早些时候尝试了字典,但错过了它是一个数组
  • 字典本身就是一个数组,它是KeyValuePair的集合
  • 是的,我猜这里的 JSON 是一个 JSON 对象数组——那些 KeyValuePairs 的对象可以用 C# 中的字典来表示——但它仍然是一个所述对象的数组
猜你喜欢
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多