在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内容如下:
{
"UserJson": {
"Name": "Dan",
"Age": 18,
"IsAdmin": false,
"Skills": [ "Cshap", "Java", "Go" ]
},
"ConStr": "连接字符串XXXXX"
}
2.创建对应的实体类User
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文件中读取并打印UserJson
和Constr
的值:
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);
}
}
在上述示例中,我们使用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