首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Newtonsoft.Json 反序列化巢狀 JSON 至 C# 物件完整指南

     編輯:程式設計疑難解答

目標 JSON

"{\"Dict\":{\"User\":{\"userDepartID\":99,\"userName\":\"admin\"}},\"Timeout\":20}"

對應實體類定義

public class UserInfo {
    public DictData Dict { get; set; }
}

public class DictData {
    public User User { get; set; }
    public int Timeout { get; set; }
}

public class User {
    public int userDepartID { get; set; }
    public string userName { get; set; }
}

反序列化程式碼

using Newtonsoft.Json;

string json = "{\"Dict\":{\"User\":{\"userDepartID\":99,\"userName\":\"admin\"}},\"Timeout\":20}";

// 方法一:泛型反序列化(推薦)
UserInfo userInfo = JsonConvert.DeserializeObject(json);

// 方法二:非泛型(舊版相容)
// UserInfo userInfo = (UserInfo)JsonConvert.DeserializeObject(json, typeof(UserInfo));

Console.WriteLine($"User: {userInfo.Dict.User.userName}, DepartID: {userInfo.Dict.User.userDepartID}, Timeout: {userInfo.Dict.Timeout}");

關鍵點

  • 類別屬性名稱 大小寫不敏感,但建議與 JSON 鍵名一致(或使用 [JsonProperty("keyName")] 映射)。
  • 巢狀物件需定義對應的類別層級(DictData、User)。
  • Timeout 在 JSON 根層級,故放在 DictData 中;若 JSON 結構不同,調整類別結構對應。

常見錯誤與解決

錯誤原因解決
NullReferenceExceptionJSON 缺少欄位、類別屬性為 null加上 NullValueHandling = NullValueHandling.Ignore 或檢查 null
JsonSerializationException型別不符(如 string vs int)確認屬性型別、使用 JsonConverter 自訂轉換
欄位為 0/null屬性無 setter 或 private確保公共 get; set;

進階技巧

  • 使用 JObject.Parse(json)["Dict"]["User"] 動態查詢無需完整類別。
  • 大量資料效能優化:重複使用 JsonSerializer 實例、啟用 ObjectCreationHandling.Reuse。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved