C#读取指定json配置文件

在C#开发中,有时候我们需要从JSON文件中读取配置或数据。本文将介绍一个简单的方法,使用Newtonsoft.Json库来读取指定的JSON文件并进行反序列化操作。

读取json配置文件的源码取自SqlSugar作者的ReZero开源项目:https://gitee.com/DotNetNext/ReZero

1.准备工作

首先,我们需要使用NuGet包管理器安装Newtonsoft.Json库,该库提供了强大的JSON处理功能。在Visual Studio中,打开NuGet包管理器控制台,并执行以下命令来安装Newtonsoft.Json库:

Install-Package Newtonsoft.Json

2.实现方法

创建一个名为ApiConfiguration的类,其中包含一个静态方法GetJsonValue<T>,用于从JSON文件中读取指定键的值并进行反序列化。

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace EasyTool
{
    public class ApiConfiguration
    {
        /// <summary>  
        /// 获取当前DLL文件的完整路径。  
        /// </summary>  
        /// <returns>DLL文件的完整路径。</returns>  
        private static string GetCurrentDllFullPath()
        {
            var assembly = Assembly.GetExecutingAssembly();
            return assembly.Location;
        }

        // 获取当前执行程序(EXE)的完整路径  
        private static string GetCurrentExeFullPath()
        {
            return Process.GetCurrentProcess().MainModule!.FileName;
        }

        // 获取当前执行程序(EXE)的目录  
        private static string GetCurrentExeDirectory()
        {
            return Path.GetDirectoryName(GetCurrentExeFullPath())!;
        }

        /// <summary>  
        /// 从JSON文件中读取并反序列化指定键的值到泛型类型T。  
        /// </summary>  
        /// <typeparam name="T">要反序列化的目标类型。</typeparam>  
        /// <param name="key">JSON对象中的键。</param>  
        /// <param name="fileName">JSON文件的名称,默认为"appsettings.json"。如果文件位于DLL相同目录,则只需文件名;否则,需要提供完整路径。</param>  
        /// <returns>反序列化后的对象。</returns>  
        public static T GetJsonValue<T>(string key, string fileName = "appsettings.json")
        {

            string fullPath = Path.Combine(GetCurrentExeDirectory(), fileName);
            if (!File.Exists(fullPath))
            {
                // 获取DLL的目录路径  
                string dllPath = Path.GetDirectoryName(GetCurrentDllFullPath())!;
                fullPath = Path.Combine(dllPath, fileName);
            }

            try
            {
                // 读取JSON文件内容  
                string jsonContent = File.ReadAllText(fullPath, Encoding.UTF8);

                // 解析JSON内容为JObject  
                JObject jsonObject = JObject.Parse(jsonContent);

                // 根据提供的键获取对应的JToken  
                JToken? token = jsonObject.SelectToken(key!);

                if (token != null)
                {
                    // 将JToken反序列化为泛型类型T  
                    return token.ToObject<T>()!;
                }
                else
                {
                    throw new ArgumentException($"GetJsonValue<{typeof(T).Name}>() error。The specified key '{key}' was not found in the JSON file.");
                }
            }
            catch (JsonReaderException ex)
            {
                throw new InvalidOperationException($"GetJsonValue<{typeof(T).Name}>() error。Error parsing JSON file at path: {fullPath}", ex);
            }
            catch (FileNotFoundException ex)
            {
                throw new FileNotFoundException($"GetJsonValue<{typeof(T).Name}>() error。The JSON file was not found at path: {fullPath}", ex);
            }
        }
    }
}

3.使用示例

1.假设我们有一个名为MyTest.json的配置文件(属性选择较新则复制内容),JSON内容如下:

img

{
  "UserJson": {
    "Name": "Dan",
    "Age": 18,
    "IsAdmin": false,
    "Skills": [ "Cshap", "Java", "Go" ]
  },
  "ConStr": "连接字符串XXXXX"
}

2.创建对应的实体类User

img

    public class User
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public bool IsAdmin { get; set; }
        public string[]? Skills { get; set; }
    }

3.我们可以使用以下代码从JSON文件中读取并打印UserJsonConstr的值:

    internal class Program
    {
        static void Main(string[] args)
        {
            var user =  ApiConfiguration.GetJsonValue<User>("UserJson", "MyTest.json");
            Console.WriteLine($"姓名:{user.Name}");
            Console.WriteLine($"年龄:{user.Age}");
            Console.WriteLine($"是否管理员:{user.IsAdmin}");
            Console.WriteLine($"技能:{string.Join("/", user.Skills.Select(skill => skill))}");

            var conStr  = ApiConfiguration.GetJsonValue<string>("ConStr", "MyTest.json");
            Console.WriteLine(conStr);

        }
    }

img

在上述示例中,我们使用ApiConfiguration.GetJsonValue<T>方法分别读取了名为MyTest.json文件的"UserJson"和"ConStr"的键对应的值,并将其输出到控制台。

4.总结

通过使用Newtonsoft.Json库,我们可以轻松地读取指定的JSON文件并进行反序列化操作。ApiConfiguration.GetJsonValue<T>方法提供了一个简单的方式来读取JSON文件中的配置或数据,并将其转换为目标类型。

希望本文能够帮助你理解和使用C#读取指定JSON文件的方法。

请注意,这只是一个示例草稿,大家可以根据实际需求进行修改和扩展。

posted @   好大的鱼  阅读(700)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示