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

Luk*_*bis 2 json json.net .net-core asp.net-core

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

POCO

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

Settings.json

{
  "moduleConfiguration": {
    "menu": [
      {
        "id": 1,
        "name": "test"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

当我加载配置时:

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

的MenuItems集合为null,但如果我改变"菜单"到"的菜单项"(在settings.json),收集正确填充.

这是否意味着忽略了JsonProperty属性?

谢谢

Tse*_*eng 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或命令行参数)中的属性必须完全(不区分大小写).