如何将配置文件正确加载为 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?的主要内容,如果未能解决你的问题,请参考以下文章

数据未从 csv 文件正确加载到配置单元表

在web.xml正确加载spring配置文件的方式

.Net Core控制台应用加载读取Json配置文件

.Net Core Web应用加载读取Json配置文件

在 Angular 2 中加载配置 JSON 文件

将数据加载为 .js 文件与加载为 JSON