首页 > 编程语言 >C#读取指定json配置文件

C#读取指定json配置文件

时间:2024-07-25 15:42:01浏览次数:13  
标签:读取 配置文件 C# GetJsonValue JSON json using string

在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文件的方法。

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

标签:读取,配置文件,C#,GetJsonValue,JSON,json,using,string
From: https://www.cnblogs.com/Misaka11639/p/18323294

相关文章

  • lazarus使用unidac+sqlite,用dbgrid显示float字段时遇到的问题
    遇到的问题:网友海使用过程发现,lazarus使用unidac+sqlite,用dbgrid显示float字段时遇到数据库的字段内容明明有多位小数,但在dbgrid只显示1位小数和截图最后1行显示1.1E2等问题。 在Navicat显示的表内容:这是他的解决方法: 修改UniConnection1的DataTypeMapping,将float映射为s......
  • LeetCode513. 找树左下角的值
    题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/description/题目叙述:给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。示例1:输入:root=[2,1,3]输出:1示例2:输入:[1,2,3,4,null,5,6,n......
  • 「模拟赛」暑期集训CSP提高模拟5(7.22)
    \(140pts,Rank24\)题目列表:简单的序列简单的字符串简单的困难的图论简单的序列\(100pts\)题意:gtm1514不喜欢序列。但是一天他拿到了一个序列。这个序列非常杂乱,于是gtm1514想要整理一下这个序列。但是由于他非常的菜,他只会进行一个操作:选择一个\(ai\),把它变......
  • C++中字符串的拼接和比较操作
    在C++中,字符串的拼接和比较是常见的操作,这些操作可以通过标准库中的std::string类来实现。下面将分别描述字符串的拼接和比较操作。字符串拼接在C++中,std::string类提供了多种方式来拼接(或称为连接)字符串。最直接的方法是使用+操作符或append()成员函数。使用+操作符cpp复......
  • cobbler学习笔记
    介绍CobblerisaversatileLinuxdeploymentservergithub链接:https://github.com/cobbler/cobbler官网:https://cobbler.github.io/文档:https://cobbler.readthedocs.io/en/latest/quickstart-guide.htmlcobblerindocker博客:https://blog.container-solutions.com/cobbl......
  • C++中的四种类型转换(静态、动态、常量、重新解释。
    在C++中,类型转换是编程语言中的一个重要概念,它允许我们将一种数据类型的值转换为另一种数据类型。C++提供了四种主要的类型转换方式:静态类型转换(StaticCast)、动态类型转换(DynamicCast)、常量类型转换(ConstCast)和重新解释类型转换(ReinterpretCast)。每种转换都有其特定的用途......
  • 何时使用static_cast、dynamic_cast、const_cast和reinterpret_cast
    在C++中,类型转换操作符static_cast、dynamic_cast、const_cast和reinterpret_cast各有其特定的使用场景。下面是每种类型转换操作符的基本用途和何时使用它们的指南:1. static_cast用途:主要用于基本数据类型之间的转换,以及有明确定义的类层次结构中的向上转换(派生类到基类)和......
  • 基于JSP、java、Tomcat三者的项目实战--校园交易网(1)-项目搭建(前期准备工作)
    这是项目的初始页面接下来我先写下我的初始项目搭建技术支持:JAVA、JSP服务器:TOMCAT7.0.86编程软件:IntelliJIDEA2021.1.3x64首先我们打开页面,准备搭建项目的初始准备1.NewProject2.随后点击Next,勾选Createprojectfromtemplate,再点击Next3.给自己的项目命名......
  • CTFHUB-SQL注入-1
    对于sql注入类型的题,首先判断注入点尝试发现注入点为?id=1'发现联合注入无法回显,尝试使用sqlmap先进行扫描sqlmap-u"http://challenge-1559e706c24187fa.sandbox.ctfhub.com:10800/?id=1'" 查询dbssqlmap-u"http://challenge-1559e706c24187fa.sandbox.ctfhub.co......
  • python cobs协议编解码算法demo
    1.SummaryCOBS(ConsistentOverheadByteStuffing)是一种算法,直译为一致的开销字节填充。简而言之,无论数据包的内容如何,都能通过产生高效可靠明确的数据包帧,从而使接受端能够从损坏的包中恢复。通常使用0x00来作为数据包的分隔符,即切割数据包的片分隔符。当使用0x00作为......