TL; DR:如何从appsettings.json读取复杂的JSON对象?
我有一个具有多种配置值的.NET Core 2.x应用程序。 appsettings.json
看起来像下面的代码段,我试图将ElasticSearch:MyIndex:mappings
的值作为单个字符串或JSON对象读取。
{
"ConnectionStrings": {
"redis": "localhost"
},
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
},
"ElasticSearch": {
"hosts": [ "http://localhost:9200" ],
"MyIndex": {
"index": "index2",
"type": "mytype",
"mappings": {
"properties": {
"property1": {
"type": "string",
"index": "not_analyzed"
},
"location": {
"type": "geo_point"
},
"code": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
通过调用Configuration.GetValue<string>("ElasticSearch:MyIndex:index")
,我可以毫无问题地阅读简单的配置值(键:值对)。
Configuration.GetSection
Configuration.GetSection("ElasticSearch:MyIndex:mappings").Value
为null
提供Value
值。
Configuration.GetValue
Configuration.GetValue<string>("ElasticSearch:MyIndex:mappings")
也返回空值。这对我来说很有意义,因为该部分基于上述尝试具有空值。
Configuration.GetValue
Configuration.GetValue<JToken>("ElasticSearch:MyIndex:mappings")
也返回空值。由于与上述相同的原因,这对我也有意义。
答案 0 :(得分:2)
Dictionary<string,object> settings = Configuration
.GetSection("ElasticSearch")
.Get<Dictionary<string,object>();
string json = JsonConvert.SerializeObject(settings);
答案 1 :(得分:1)
解决方案最终比我最初尝试的任何东西都简单得多:将appsettings.json读取为任何其他JSON格式的文件。
<body>
<div class="sitebg-parent">
<div class="sitebg"></div>
</div>
</body>
答案 2 :(得分:0)
将JSON对象转换为转义的字符串。为此,您很可能只需要转义所有双引号并将其放在一行上,这样看起来就像:
"ElasticSearch": "{\"hosts\": [ \"http://localhost:9200\" ],\"MyIndex\": {\"index\"... "
然后您可以将其读取为一个字符串,只需使用以下命令即可对其进行解析:
Configuration["ElasticSearch"]
此解决方案并不适合所有人,因为查看或更新转义的json并不有趣,但是如果您只计划很少对此配置设置进行更改,那么它可能不是最坏的主意。
答案 3 :(得分:0)
@chris31389 的解决方案很好,并收到了我的投票。但是,我的情况需要更通用的解决方案。
private static IConfiguration configuration;
public static TConfig ConfigurationJson<TConfig>(this string key)
{
var keyValue = GetJson();
return Newtonsoft.Json.JsonConvert.DeserializeObject<TConfig>(keyValue);
string GetJson()
{
if (typeof(TConfig).IsArray)
{
var dictArray = configuration
.GetSection(key)
.Get<Dictionary<string, object>[]>();
return Newtonsoft.Json.JsonConvert.SerializeObject(dictArray);
}
var dict = configuration
.GetSection(key)
.Get<Dictionary<string, object>[]>();
return Newtonsoft.Json.JsonConvert.SerializeObject(dict);
}
}
注意事项:
configuration
.GetSection(key)
.Get<TConfig>()
答案 4 :(得分:0)
我通过将其绑定到一个类来获取配置数据并在任何地方用作服务,在 configureservices 我添加这个类
services.Configure<SiteSettings>(options => Configuration.Bind(options));
然后在控制器中我可以通过依赖注入访问它,如下所示:
private readonly IOptionsSnapshot<SiteSettings> _siteSetting;
public TestController(IOptionsSnapshot<SiteSettings> siteSetting) ......