.net 读取json配置

211 阅读1分钟

安装相关包

Microsoft.Extensions.Configuration image.png

Microsoft.Extensions.Configuration.JSON image.png

创建json 配置文件

image.png

方式一

加载配置

using Microsoft.Extensions.Configuration;

namespace Config
{
    public class Class1
    {
        static void Main(string[] args)
        {
            ConfigurationBuilder configuration = new ConfigurationBuilder();
            configuration.AddJsonFile(
                "config.json",
                optional:true ,
                reloadOnChange:true
                );
            IConfigurationRoot configurationRoot = configuration.Build();

            string name = configurationRoot["name"];
            Console.WriteLine($"name={name}");

            string addr = configurationRoot.GetSection("proxy:address").Value;
            Console.WriteLine($"addr={addr}");

            
        }
    }
}

控制台展示

image.png

方式二

下载依赖

Microsoft.Extensions.Configuration.Binder image.png

修改json配置

{
  "name": "zhangsan",
  "age": "33",
  "proxy": {
    "address": "南京一区",
    "port": "80"
  }
}

测试

一、修改测试类

using Microsoft.Extensions.Configuration;

namespace Config
{
    public class Class1
    {
        static void Main(string[] args)
        {
            ConfigurationBuilder configuration = new ConfigurationBuilder();
            configuration.AddJsonFile(
                "config.json",
                optional: true,
                reloadOnChange: true
                );
            IConfigurationRoot configurationRoot = configuration.Build();

            /*  string name = configurationRoot["name"];
              Console.WriteLine($"name={name}");

              string addr = configurationRoot.GetSection("proxy:address").Value;
              Console.WriteLine($"addr={addr}");*/

            Proxy proxy = configurationRoot.GetSection("proxy").Get<Proxy>();
            Console.WriteLine($"{proxy.Address},{proxy.port}");

        }

        class Proxy
        {
            public string Address { get; set; }

            public int port { get;set; }
        }
    }
}

控制台展示

image.png

二、修改测试类

using Microsoft.Extensions.Configuration;

namespace Config
{
    public class Class1
    {
        static void Main(string[] args)
        {
            ConfigurationBuilder configuration = new ConfigurationBuilder();
            configuration.AddJsonFile(
                "config.json",
                optional: true,
                reloadOnChange: true
                );
            IConfigurationRoot configurationRoot = configuration.Build();

            /*  string name = configurationRoot["name"];
              Console.WriteLine($"name={name}");

              string addr = configurationRoot.GetSection("proxy:address").Value;
              Console.WriteLine($"addr={addr}");*/

            /* Proxy proxy = configurationRoot.GetSection("proxy").Get<Proxy>();
             Console.WriteLine($"{proxy.Address},{proxy.port}");*/

            Config config = configurationRoot.Get<Config>();
            Console.WriteLine(config.name);
            Console.WriteLine(config.age);
            Console.WriteLine(config.proxy.port);
            Console.WriteLine(config.proxy.Address);
        }

        class Proxy
        {
            public string Address { get; set; }

            public int port { get;set; }
        }

        class Config
        {
            public string name { get; set; }
            public int age { get; set; }
            public Proxy proxy { get; set; }
        }
    }
}

控制台展示

image.png

方式三

修改测试类

image.png

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace Config1
{
    public class Class1
    {
        static void Main(string[] args)
        {
            ServiceCollection serviceCollection = new ServiceCollection();
            serviceCollection.AddScoped<Controller>();

            ConfigurationBuilder configuration = new ConfigurationBuilder();
            configuration.AddJsonFile(
                "config.json",
                optional: true,
                reloadOnChange: true
                );
            IConfigurationRoot configurationRoot = configuration.Build();

            serviceCollection.AddOptions().Configure<Config>(e=>configurationRoot.Bind(e));

            using (var sp = serviceCollection.BuildServiceProvider())
            {
               var c =  sp.GetRequiredService<Controller>();
                c.Test();
            }

                /*  string name = configurationRoot["name"];
                  Console.WriteLine($"name={name}");

                  string addr = configurationRoot.GetSection("proxy:address").Value;
                  Console.WriteLine($"addr={addr}");*/

                /* Proxy proxy = configurationRoot.GetSection("proxy").Get<Proxy>();
                 Console.WriteLine($"{proxy.Address},{proxy.port}");*/

           /* Config config = configurationRoot.Get<Config>();
            Console.WriteLine(config.name);
            Console.WriteLine(config.age);
            Console.WriteLine(config.proxy.port);
            Console.WriteLine(config.proxy.Address);*/
        }

        public class Proxy
        {
            public string Address { get; set; }

            public int port { get;set; }
        }

        public class Config
        {
            public string name { get; set; }
            public int age { get; set; }
            public Proxy proxy { get; set; }
        }
    }
}

新增控制器

using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static Config1.Class1;

namespace Config1
{
    public class Controller
    {
     
        public readonly IOptionsSnapshot<Config> optionConfig;
        public Controller(IOptionsSnapshot<Config> optionConfig)
        {
            this.optionConfig = optionConfig;
        }

        public void Test()
        {
            Console.WriteLine(optionConfig.Value.name);
            Console.WriteLine(optionConfig.Value.age);
            Console.WriteLine(optionConfig.Value.proxy.Address);
            Console.WriteLine(optionConfig.Value.proxy.port);
        }
    }
}

控制台输出

image.png

动态修改

若想控制台输出随着配置文件的修改而修改,可做出如下修改

using (var sp = serviceCollection.BuildServiceProvider())
    {
        // 配置之后,会在下一个scope中生效
        using(var scope = sp.CreateScope())
        {
            var c = sp.GetRequiredService<Controller>();
            c.Test();

            Console.WriteLine("********************");

            var c2 = sp.GetRequiredService<Controller2>();
            c2.Test();
        }

    }

方式四_控制台输入

安装包

Microsoft.Extensions.Configuration.CommandLine

image.png

修改启动类

 configuration.AddCommandLine(args);

image.png

控制台输入参数

进入 xxx\Config\bin\Debug\net6.0,输出cmd

image.png

控制台输入 Config1.exe name=lisi age=23

image.png

调试框输入参数

image.png

image.png

image.png

复杂结构配置

image.png

image.png

image.png

方式五_修改环境变量

下载包

Microsoft.Extensions.Configuration.Environment

image.png

修改环境变量

image.png

修改启动类

image.png

运行结果

image.png

隔离环境变量

指定环境变量前缀:

configuration.AddEnvironmentVariables("c1_");

image.png

只有前缀为"c1_"的环境变量才能被读取

image.png