在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檔案的方法。
請注意,這只是一個示例草稿,大家可以根據實際需求進行修改和擴充套件。