C#讀取指定json配置檔案

好大的鱼發表於2024-07-25

在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檔案的方法。

請注意,這只是一個示例草稿,大家可以根據實際需求進行修改和擴充套件。

相關文章