2017-03-29 73 views
2

我一直在玩強類型的配置在.NET的核心,我已經發現了一些奇怪的行爲在.NET睿強類型的配置忽略JsonProperty屬性

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集合爲空,但如果我將「菜單」更改爲「menuItems」(在settings.json中),則集合正確填充。

是否意味着JsonProperty屬性被忽略?

感謝

+0

這不是有效的JSON開始 – DavidG

+0

@DavidG已更新 –

+0

屬性JsonProperty定義在哪裏? – mxmissile

回答

5

這不是如何Microsoft.Extensions.Configuration(和Microsoft.Extensions.Configuration.Json特別)的作品。它不使用JSON.NET來反序列化配置,因爲配置設置可能來自不同的來源,例如xml文件,環境變量或命令行參數。

所有這些都存儲在字典和查詢。

例如,如果你想通過配置你所要做的Configuration["moduleConfiguration:menu"]訪問moduleConfiguration.menu(注意冒號:用作分隔符子對象)。

由於上述原因,通過[JsonProperty("menu")]註釋屬性將不會執行任何操作,因爲JSON.NET不參與進程,屬性只是元數據,不會自行執行任何操作。

此外,當您在GitHub上觀察源代碼時,您會看到它使用JsonReader和訪客模式來填充字典。這就是說:C#中的屬性和json(或xml或命令行參數)中的屬性必須完全(不區分大小寫)。