如何正确加载Json配置文件?

问题描述 投票:0回答:2

我有一个与 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,我感觉无法将数据用作循环。看来配置文件中的所有数据都是关键

enter image description here

这是逻辑,因为我的配置文件可以是任何东西。构建器无法保证我的数组将始终具有相同的对象。因此,构建器将数组中的每个元素视为唯一的标记。这个我能理解。

那么,如何在结构化对象中加载我的配置或此 Json 文件?有没有办法以更好的方式将其加载为配置文件?因为实际上我的数组中有 2 个对象,我想对它们进行循环。对于每个对象我都会做一些事情。

c# json .net-core configuration
2个回答
0
投票

由于您的主要目标是将 JSON 对象绑定到普通 C# 对象中,因此您可以查看 ASP .NET Core 中的选项模式。官方文档很好地描述了您的情况。


0
投票
配置中的 json 文件并不是真正用来保存数组的。如果您将来进行登台,您将遇到各种不愉快的意外,请参阅此处的答案以了解我的意思:

用 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;} }
    
© www.soinside.com 2019 - 2024. All rights reserved.