首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# JSON 實用工具類庫:JsonConverter、JsonHelper、JsonSplit、AjaxResult 四合一完整原始碼

     編輯:關於C語言

本文整理四大 JSON 核心操作類別,涵蓋動態物件轉換、序列化/反序列化、資料表轉 JSON、JSON 格式驗證、AJAX 統一回傳格式,程式碼開箱即用,適合直接納入專案共用函式庫。

一、JsonConverter:動態物件與資料容器轉 JSON 核心引擎

基於 JavaScriptSerializer,支援:

  • 任意物件 ↔ JSON 字串(含日期格式化)
  • DataReader、DataSet、DataTable → JSON
  • 字串特殊字元過濾(跳脫引號、換行、Tab 等)
  • 動態型別解析(DynamicJsonObject + DynamicJsonConverter)

關鍵方法簽章


public static class JsonConverter
{
    // 物件 → JSON(可選日期轉換)
    public static string Serialize(object obj, bool dateConvert = false);

    // JSON → 動態物件
    public static dynamic ConvertJson(string json);

    // 自定義查詢物件 → 動態物件
    public static dynamic JsonClass(object obj);

    // DataReader → JSON 字串
    public static string ToJson(IDataReader reader);

    // DataSet → JSON(多資料表)
    public static string ToJson(DataSet ds);

    // DataTable → JSON(指定根節點名)
    public static string ToJson(DataTable dt, string jsonName);

    // DataTable → JSON(預設根節點)
    public static string ToJson(DataTable dt);

    // 內部:型別格式化(字串/日期/布林/位元組/Guid)
    private static string StringFormat(string str, Type type);

    // 內部:特殊字元跳脫
    public static string String2Json(string s);
}

動態解析用法範例


string json = @"{""name"":""Tom"",""age":25,""skills"":[""C#"",""SQL""]}";
dynamic obj = JsonConverter.ConvertJson(json);
Console.WriteLine(obj.name);      // Tom
Console.WriteLine(obj.age);       // 25
foreach (var s in obj.skills)     // 動態陣列迭代
    Console.WriteLine(s);

二、JsonHelper:基於 Newtonsoft.Json 的高效能輔助類

依賴 Newtonsoft.Json 套件,提供型別安全的泛型序列化/反序列化。


public static class JsonHelper
{
    // 物件 → 縮排 JSON
    public static string ToJson(object t);

    // 物件 → JSON(可選忽略 null 值)
    public static string ToJson(object t, bool ignoreNull);

    // JSON → 強型別物件
    public static T FromJson(string json) where T : class;

    // List → JSON(使用 DataContractJsonSerializer)
    public static string ListToJson(IList list);

    // 狀態/訊息/資料/導向 URL 統一回傳模型屬性
    public string Status { get; set; }
    public string Msg { get; set; }
    public object Data { get; set; }
    public string ReUrl { get; set; }
}


使用範例


var user = new { Id = 1, Name = "Alice", Roles = new[] { "Admin", "User" } };
string json = JsonHelper.ToJson(user, ignoreNull: true);
// {"Id":1,"Name":"Alice","Roles":["Admin","User"]}

var restored = JsonHelper.FromJson(json);
Console.WriteLine(restored.Name); // Alice

三、JsonSplit:純演算法 JSON 格式驗證器(零相依)

不依賴任何 JSON 程式庫,透過字元狀態機驗證字串是否為合法 JSON(物件或陣列),並回傳錯誤位置索引。


public static class JsonSplit
{
    // 簡單驗證
    public static bool IsJson(string json);

    // 驗證並取得錯誤索引
    public static bool IsJson(string json, out int errIndex);
}

驗證邏輯亮點

  • 狀態機追蹤:物件開始/結束 {}、陣列開始/結束 []、鍵值對分隔 :、項目分隔 ,、字串跳脫 \、引號配對。
  • 支援巢狀物件/陣列遞迴驗證。
  • 忽略空白字元 \r\n\t\0 。
  • 回傳 errIndex 便於前端高亮錯誤位置。

使用場景

  • 接收前端 AJAX 原始 JSON 字串前的預檢。
  • 記錄檔/設定檔 JSON 完整性檢查。
  • 單元測試中驗證序列化輸出格式。

四、AjaxResult:前後端統一回傳封裝

標準化 AJAX 回應結構:IsError、Message、Data,提供靜態工廠方法快速建立成功/失敗結果。


public class AjaxResult
{
    public bool IsError { get; private set; }
    public string Message { get; set; }
    public object Data { get; set; }

    private AjaxResult() { }

    // 靜態工廠方法
    public static AjaxResult Error() => new AjaxResult { IsError = true };
    public static AjaxResult Error(string msg) => new AjaxResult { IsError = true, Message = msg };
    public static AjaxResult Success() => new AjaxResult { IsError = false };
    public static AjaxResult Success(string msg) => new AjaxResult { IsError = false, Message = msg };
    public static AjaxResult Success(object data) => new AjaxResult { IsError = false, Data = data };
    public static AjaxResult Success(object data, string msg) => new AjaxResult { IsError = false, Data = data, Message = msg };

    // 序列化為 JSON 字串(供 Controller 直接回傳)
    public override string ToString() => new JavaScriptSerializer().Serialize(this);
}

Controller 使用範例


public ActionResult GetUser(int id)
{
    var user = _service.GetById(id);
    if (user == null)
        return Content(AjaxResult.Error("使用者不存在").ToString());

    return Content(AjaxResult.Success(user, "查詢成功").ToString());
}

// 前端 JS 接收統一處理
// $.post('/GetUser', {id:1}, function(res) {
//     if (res.IsError) showError(res.Message);
//     else renderUser(res.Data);
// });

整合建議與遷移指南

類別建議使用場景相依套件備註
JsonConverter舊專案、DataTable/DataSet 轉 JSON、需動態解析System.Web.Extensions基於 JavaScriptSerializer,效能較 Newtonsoft 慢
JsonHelper新專案、高效能序列化、強型別反序列化Newtonsoft.Json推薦主力庫,支援 .NET Standard/Core
JsonSplit輕量驗證、無法引入套件環境無純演算法,適合前置檢查
AjaxResult所有 AJAX 端點統一回傳格式System.Web.Extensions可配合 JsonHelper.ToJson 序列化

現代化替代方案(.NET Core 3.0+ / .NET 5+)

  • System.Text.Json:內建高效能、零相依、支援非同步串流,建議新專案優先採用。
  • JsonSerializer.Serialize/Deserialize 替代 JsonHelper。
  • JsonDocument、JsonElement 替代動態解析。
  • JsonNode(.NET 6+)提供可變動 DOM 操作。

原始碼整合步驟

  1. 建立專案 Common.Utilities.Json(Class Library)。
  2. 將四個類別檔案加入專案,調整命名空間為 Common.Utilities.Json。
  3. NuGet 安裝 Newtonsoft.Json(供 JsonHelper 使用)。
  4. 專案參考 System.Web.Extensions(供 JavaScriptSerializer、AjaxResult 使用)。
  5. 建置並發布 NuGet 套件或專案參考給主專案使用。

擁有這套工具類,即可應付 90% 以上的 JSON 處理需求,專注業務邏輯開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved