如何将配置文件正确加载为 Json?
Posted
技术标签:
【中文标题】如何将配置文件正确加载为 Json?【英文标题】:How to properly load a configuration file as Json? 【发布时间】:2021-09-02 20:28:21 【问题描述】:我有一个关于 Json 的问题。让我先给你我的 Json 示例:
"watch": [
"path": "C:/Temp",
"conditions": "*.log",
"actions": ""
,
"path": "C:/Temps",
"conditions": ".log",
"actions": ""
]
我想看目录。所以我的 Json 会有一个数据数组。
我想交叉检查我是否正确地做一些事情。我是一名 C# 开发人员,但我对 .NET Core 还是很陌生。通常我通过使用 Newtonsoft 包中的序列化来加载我的 Json 文件。使用 .NET 代码,我感觉我们的做法有点不同。我正在这样做:
static void Main(string[] args)
var configurationBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", optional: true, reloadOnChange: true)
.Build();
然后我可以使用这个访问我的数据
configurationBuilder["watch:0:path"]
"C:/Temp"
很好,但这不是我想要的。我想循环我的数组。使用 ConfigurationBuilder,我感觉无法将数据用作循环。配置文件中的所有数据似乎都是一个键
这是逻辑,因为我的配置文件可以是任何东西。构建器不能保证我的数组总是有相同的对象。因此,构建器将我的数组中的每个元素都视为一个唯一的标记。这个我能理解。
那么,如何将我的配置或这个 Json 文件加载到结构化对象中?有没有办法以更好的方式将其加载为配置文件?因为实际上我的数组中有 2 个对象,我想循环它们。对于每个对象,我都会做一些事情。
【问题讨论】:
你能试试这个IConfiguration configuration; var section = configuration.GetSection("watch"); if(section != null) var children = section.GetChildren();
这能回答你的问题吗? How to map multiple levels of Settings from appsettings.json in .Net 5 (Asp.Net)
【参考方案1】:
配置中的 json 文件并不真正意味着保存数组。如果您将来进行分期,您将遇到各种令人不快的意外,请参阅我的回答以了解我的意思:Override array settings in appsettings.json with those in appsettings.Production.json 我认为在您的情况下,您最好使用 Newtonsoft 反序列化。
另一方面,如果暂存不是问题,您可以硬输入您的设置:
public class Startup
// Called by runtime
public void ConfigureServices(IServiceCollection services)
services.Configure<WatchSettings>(configuration.GetSection(nameof(WatchSettings)));
通过选项将它们注入你的类:
MyClass(IOptions<WatchSettings> watchSettings)
与WatchSettings
本身相比,您可以实现各种东西,例如访问器、属性、枚举器以及不向调用代码隐藏细节的东西:
class WatchSettings
IEnumerable<Watch> Watches get;set;
【讨论】:
我会试试这个。我是 .NET Core 的新手。你能告诉我这个服务类的确切来源吗? 我将首先使用经典的 Newtonsoft Json 库来加载我的 watch.json 文件。 services 来自 Startup 类,这对于 .net 核心应用程序非常常见,并且所有 DI 人员都在其中配置。它被添加到 Main 中的主机并负责设置。 Main 本身没有什么逻辑。以下是一些入门信息:docs.microsoft.com/en-us/aspnet/core/fundamentals/…【参考方案2】:由于您的主要目标是将 JSON 对象绑定到纯 C# 对象,您可以查看 Options Pattern in ASP .NET Core。官方文档很好的描述了你的情况。
【讨论】:
以上是关于如何将配置文件正确加载为 Json?的主要内容,如果未能解决你的问题,请参考以下文章