**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")
,我能够毫无问题地读取简单的配置值(键:值对)。
配置。GetSectionConfiguration.GetSection("ElasticSearch:MyIndex:mappings").Value
为Value
提供了一个null
值。
配置。GetValueConfiguration.GetValue<string>("ElasticSearch:MyIndex:mappings")
也返回空值。这对我来说是有意义的,因为基于上述尝试,该部分具有空值。
配置。GetValueConfiguration.GetValue<JToken>("ElasticSearch:MyIndex:mappings")
也返回空值。这对我来说也是有意义的,原因和上面一样。
7条答案
按热度按时间zqry0prt1#
wbrvyc0a2#
最终的解决方案比我最初尝试的任何方法都要简单得多:阅读应用程序设置。json和其他JSON格式的文件一样。
xzv2uavs3#
将JSON对象转换为转义字符串。要做到这一点,你很可能只需要转义所有的双引号,并把它放在 * 一行 *,所以它看起来像这样:
然后你可以将它读入一个字符串,可以通过使用以下命令进行解析:
这个解决方案并不适合每个人,因为查看或更新转义的json并不有趣,但是如果你只打算很少更改这个配置设置,那么它可能不是最坏的主意。
beq87vna4#
@chris31389的解决方案很好,收到了我的投票。然而,我的情况需要一个更通用的解决方案。
备注:
Microsoft.Extensions.Configuration.活页夹
为必填项Dictionary[]
。这就是为什么其他解决方案有时不起作用的原因。wz8daaqr5#
读取配置:
然后您可以创建一个POCO来MapJSON文件的结构(或其一部分)。例如,如果类名为ConnectionStringsConfiguration
然后用途:
vbopmzt16#
我通过将配置数据绑定到一个类来获取配置数据,并在任何地方作为服务使用,在configureservices中我添加了这个类
然后在控制器中,我可以通过依赖注入来访问它,如下所示:
pod7payv7#
简单示例
使用扩展方法:
那就这样叫吧:
不那么简单的例子
下面是一个使用嵌套POCO和数组的更高级的示例。以下是配置POCO:
相应的配置部分如下所示:
然后像这样取它:
注意事项
*请确保您的POCO包含合理的默认值。如果
appsettings.json
中不存在该节,或者无法成功绑定到POCO,则将使用POCO的默认值。