我有一个与 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 个对象,我想对它们进行循环。对于每个对象我都会做一些事情。
由于您的主要目标是将 JSON 对象绑定到普通 C# 对象中,因此您可以查看 ASP .NET Core 中的选项模式。官方文档很好地描述了您的情况。
用 appsettings.Production.json 中的设置覆盖 appsettings.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;}
}