.NET Core中的强类型配置忽略JsonProperty属性

时间:2017-03-29 17:40:04

标签: json asp.net-core json.net .net-core

我一直在.NET Core中使用强类型配置,而且我发现了一些奇怪的行为。

POCO

public class ModuleConfiguration
{
    [JsonProperty("menu")]
    public List<MenuItem> MenuItems { get; set; }
}

Settings.json

{
  "moduleConfiguration": {
    "menu": [
      {
        "id": 1,
        "name": "test"
      }
    ]
  }
}

加载配置时:

var builder = new ConfigurationBuilder().AddJsonFile(path);
var config = builder.Build().GetSection("moduleConfiguration").Get<T>();

MenuItems 集合为空,但如果我更改&#34; menu&#34; to&#34; menuItems&#34; (在settings.json中),正确填充集合。

是否意味着忽略 JsonProperty 属性?

由于

1 个答案:

答案 0 :(得分:5)

那不是Microsoft.Extensions.Configuration(尤其是Microsoft.Extensions.Configuration.Json)的工作方式。由于配置设置可以来自不同的源,例如xml文件,环境变量或命令行参数,因此它不会使用JSON.NET来反序列化配置。

所有这些都存储在字典中并进行查询。

例如,如果要通过配置访问moduleConfiguration.menu,则必须执行Configuration["moduleConfiguration:menu"](请注意,冒号:用作子对象的分隔符)。

由于上述原因,通过[JsonProperty("menu")]注释属性不会做任何事情,因为JSON.NET不参与该过程,而属性只是元数据而不做什么都不是。

当您在GitHub上观察源代码时,您会看到它使用JsonReader和访问者模式来填充字典。

话虽如此:C#中的属性和json(或xml或命令行参数)中的属性必须完全(不区分大小写)。