JsonConvert.DeserializeObject:將JSON反序列化為C# POCO類別
在處理RESTful API時,通常需要將JSON回應反序列化為C#普通舊CLR物件(POCO)。常用的方法是JsonConvert.DeserializeObject。
問題:
考慮以下User POCO類別:
User.cs:
1 2 3 4 5 6 7 8 9 | <code class = "language-c#" > public class User
{
public string Username { get; set; }
public string Name { get; set; }
public string Location { get; set; }
[JsonProperty( "accounts" )]
public List<Account> Accounts { get; set; }
}</code>
|
登入後複製
當嘗試使用JsonConvert.DeserializeObject將JSON反序列化到此類時,會拋出異常,指示JSON數組無法反序列化為Account列表。
解:
要解決此問題,需要考慮兩個關鍵點:
1. 將Accounts屬性宣告為物件:
更改Accounts屬性聲明以表示物件而不是清單。
User.cs(更新):
1 2 3 4 5 6 | <code class = "language-c#" > public class User
{
[JsonProperty( "accounts" )]
public Account Accounts { get; set; }
}</code>
|
登入後複製
2. 使用JsonProperty屬性:
將JsonProperty屬性套用至每個屬性,以將JSON屬性名稱對應到C#屬性名稱。
User.cs(使用JsonProperty):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <code class = "language-c#" > public class User
{
[JsonProperty( "username" )]
public string Username { get; set; }
[JsonProperty( "name" )]
public string Name { get; set; }
[JsonProperty( "location" )]
public string Location { get; set; }
[JsonProperty( "accounts" )]
public Account Accounts { get; set; }
}</code>
|
登入後複製
附加類別(Account和Badge):
為任何嵌套物件(例如Accounts和Badges)定義附加類,並相應地應用JsonProperty屬性。
Account.cs:
1 2 3 4 5 | <code class = "language-c#" > public class Account
{
[JsonProperty( "github" )]
public string Github { get; set; }
}</code>
|
登入後複製
Badge.cs:
1 2 3 4 5 6 7 8 9 10 | <code class = "language-c#" > public class Badge
{
[JsonProperty( "name" )]
public string Name { get; set; }
[JsonProperty( "description" )]
public string Description { get; set; }
}</code>
|
登入後複製
範例用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <code class = "language-c#" >using Newtonsoft.Json;
using System.Net;
class Program
{
static User LoadUserFromJson(string response)
{
var user = JsonConvert.DeserializeObject<User>(response);
return user;
}
static void Main()
{
using (WebClient wc = new WebClient())
{
var json = wc.DownloadString( "http://coderwall.com/mdeiters.json" );
var user = LoadUserFromJson(json);
}
}
}</code>
|
登入後複製
透過這些更改,JsonConvert.DeserializeObject現在可以成功地將JSON反序列化到User POCO類,並適當地處理巢狀物件(Accounts)。
以上是將 JSON 反序列化為 C# POCO 類別時如何解決 JsonConvert.DeserializeObject 錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!