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

ASP.NET 萬能 JSON 解析器:無實體類動態解析任意結構 JSON

     編輯:ASP.NET 基礎

前言

在對接第三方 API、處理動態配置、日志分析等場景中,JSON 結構往往不固定、層級深、字段多變。傳統強類型反序列化需預先定義實體類,靈活性不足。本文介紹一款輕量級的通用 JSON 解析器,通過 DOM 樹遍歷實現任意結構 JSON 的動態查詢與提取,無需實體類、零依賴、易擴展。

核心設計理念

將 JSON 視為三類節點的遞歸組合:

  • Value(值節點):字符串、數字、布爾、null
  • Model(對象節點):鍵值對集合 { "key": value }
  • Collection(數組節點):有序列表 [value, value, ...]

核心類結構

1. 基礎解析器 CommonJsonModelAnalyzer

提供底層字符串操作:鍵提取、值提取、數組元素分割(正確處理巢狀結構)

protected List _GetCollection(string rawJson)
{
    // 智能分割頂層逗號,忽略對象/數組內部的逗號
    // 通過 nestLevel (大括號深度) 和 mNestLevel (中括號深度) 追蹤層級
}

2. 通用模型 CommonJsonModel

封裝解析邏輯,提供豐富的查詢 API:

public class CommonJsonModel : CommonJsonModelAnalyzer
{
    // 類型判斷
    public bool IsValue() { ... }
    public bool IsModel() { ... }
    public bool IsCollection() { ... }
    
    // 按鍵查詢(針對 Model 節點)
    public string GetValue(string key) { ... }
    public CommonJsonModel GetModel(string key) { ... }
    public CommonJsonModel GetCollection(string key) { ... }
    public List GetKeys() { ... }
    
    // 針對 Collection 節點
    public List GetCollection() { ... }
}

使用示例

場景一:簡單鍵值

string json = @"{""total"": 0}";
var model = new CommonJsonModel(json);
string total = model.GetValue("total"); // "0"

場景二:巢狀對象

string json = @"{""total"":0,""data"":{""377149574"": 1}}";
var model = new CommonJsonModel(json);
string val = model.GetModel("data").GetValue("377149574"); // "1"

場景三:複雜巢狀數組

string json = @"{""total"":0,""data"":{""377149574"":[{""cid"":""377149574""}]}}";
var model = new CommonJsonModel(json);

// 鏈式調用:取 data -> 取 377149574 數組 -> 取第 0 項對象 -> 取 cid 值
string cid = model
    .GetModel("data")
    .GetCollection("377149574")
    .GetCollection()[0]
    .GetValue("cid"); // "377149574"

核心優勢

特性說明
零依賴純 .NET Framework 實現,無 Newtonsoft.Json/System.Text.Json 依賴
無實體類動態解析任意結構,適配頻繁變更的 API 響應
輕量級核心代碼 < 300 行,易嵌入、易修改、易審計
鏈式 API流暢接口設計,代碼可讀性強
容錯性鍵不存在返回 null,不拋異常,適合探查式解析

局限性與適用邊界

  • 性能:基於字符串操作與遞歸解析,大 JSON(>100KB)或高頻調用(>1000 QPS)性能遜於編譯型反序列化器
  • 嚴格性:非標準 JSON(如尾隨逗號、單引號、註釋)可能解析失敗
  • 類型信息:所有值均為字符串,需自行轉型(int.Parse、bool.Parse 等)

最佳實踐建議

  1. 緩存解析結果:相同 JSON 重複查詢時,復用 CommonJsonModel 實例
  2. 混合模式:固定結構部分用強類型反序列化,動態擴展字段用本解析器
  3. 生產環境:建議接入單元測試覆蓋核心解析邏輯,防止異常 JSON 導致死循環或棧溢出
  4. 替代升級:.NET Core 3.1+ 專案優先考慮 System.Text.Json.Nodes.JsonNode 官方動態 API

結語

這款萬能 JSON 解析器以「無實體類、動態查詢、零依賴」三大特性,完美填補了強類型反序列化在動態場景下的能力空白。雖非高性能首選,但在 API 聯調、配置管理、日志分析等中低頻動態場景中,是極具性價比的利器。

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