目標 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 結構不同,調整類別結構對應。
常見錯誤與解決
| 錯誤 | 原因 | 解決 |
| NullReferenceException | JSON 缺少欄位、類別屬性為 null | 加上 NullValueHandling = NullValueHandling.Ignore 或檢查 null |
| JsonSerializationException | 型別不符(如 string vs int) | 確認屬性型別、使用 JsonConverter 自訂轉換 |
| 欄位為 0/null | 屬性無 setter 或 private | 確保公共 get; set; |
進階技巧
- 使用
JObject.Parse(json)["Dict"]["User"] 動態查詢無需完整類別。
- 大量資料效能優化:重複使用
JsonSerializer 實例、啟用 ObjectCreationHandling.Reuse。