|
|
|
|
|
JSON(JavaScript 對(duì)象表示法)是一種輕量級(jí)數(shù)據(jù)交換格式。它獨(dú)立于語言,易于理解和自我描述。它被用作 XML 的替代品。
JSON 表示結(jié)構(gòu)化文本格式的對(duì)象和存儲(chǔ)在鍵值對(duì)中的數(shù)據(jù),在C#代碼中使用 JSON 的方法有很多種,本文介紹幾種常用的方法。
使用 JsonSerializer.Deserialize
在.NET中,System.Text.Json
命名空間提供了一個(gè)類JsonSerializer
,它有兩個(gè)靜態(tài)方法,JsonSerializer.Serialize
和JsonSerializer.Deserialize
。JsonSerializer.Deserialize
方法用于將 JSON 字符串解析為對(duì)象并讀取其成員值。
下面是一個(gè)用于創(chuàng)建 JSON 數(shù)據(jù)的 C# 對(duì)象示例。
public class CSharpMember
{
public string Name { get; set; }
public string Bio { get; set; }
public DateTime JoinDate { get; set; }
public bool Author { get; set; }
}
為上述對(duì)象創(chuàng)建的 JSON 字符串如下所示。
// 獲得JSON字符串
string jsonMemberString = "{\"Name\":\"Mahesh Chand\",\"Bio\":\"Software developer\"," +
"\"JoinDate\":\"2000-01-01T00:00:00-00:00\",\"Author\":true}";
你可以調(diào)用 JsonSerializer.Deserialize
方法將字符串反序列化為對(duì)象。
// 將JSON字符串反序列化為對(duì)象
CSharpMember member = JsonSerializer.Deserialize<CSharpMember>(jsonMemberString);
一旦 JSON 字符串被反序列化為一個(gè)對(duì)象,現(xiàn)在就可以很容易地通過對(duì)象成員讀取它的值。
// 使用對(duì)象成員讀取/解析數(shù)據(jù)
Console.WriteLine($"Name: {member.Name}");
Console.WriteLine($"Bio: {member.Bio}");
Console.WriteLine($"JoinDate: {member.JoinDate}");
Console.WriteLine($"Author: {member.Author}");
該程序的輸出如下所示:
Deserialize JSON string
Name: Mahesh Chand
Bio: Software developer
JoinDate: 12/31/1999 7:00:00 PM
Author: True
使用 JsonConverter
Newtonsoft 也稱為 Json.NET。它是 .NET 的高性能 JSON 框架。它非常易于使用,并且比 .NET 的內(nèi)置 JSON 序列化快得多。
JsonConvert
類有一個(gè)與 JSON 字符串相互轉(zhuǎn)換的方法,分別是 SerializeObject()
和 DeserializeObject()
。它可以用在我們不想與 JSON 字符串相互轉(zhuǎn)換的地方。
在下面的示例中,我使用“JsonConvert.DeserializeObject
”方法將我的 JSONobject 轉(zhuǎn)換為我的自定義類對(duì)象。這里的 JSON 鍵名必須與類屬性名匹配,并且匹配不區(qū)分大小寫。
static void Main(string[] args)
{
stringjsonData = @ "{
'FirstName': 'Jignesh', 'LastName': 'Trivedi'
}
";
var myDetails = JsonConvert.DeserializeObject < MyDetail > (jsonData);
Console.WriteLine(string.Concat("Hi ", myDetails.FirstName, " " + myDetails.LastName));
Console.ReadLine();
}
public class MyDetail
{
public string FirstName {
get;
set;
}
public string LastName {
get;
set;
}
}
使用 JObject.Parse
JObject
類有Parse
方法;它解析 JSON 字符串并將其轉(zhuǎn)換為鍵值字典對(duì)象。在下面的示例中,我使用了“JObject.Parse
”方法并使用鍵檢索數(shù)據(jù)。
string jsonData = @"{
'FirstName':'Jignesh',
'LastName':'Trivedi'
}";
var details = JObject.Parse(jsonData);
Console.WriteLine(string.Concat("Hi ", details["FirstName"], " " + details["LastName"]));
Console.ReadLine();
在下面的代碼片段中,我們只是將 JObject.Parse
方法輸出分配給動(dòng)態(tài)對(duì)象并將訪問值作為動(dòng)態(tài)對(duì)象的屬性。
string jsonData = @"{
'FirstName':'Jignesh',
'LastName':'Trivedi'
}";
dynamic data = JObject.Parse(jsonData);
Console.WriteLine(string.Concat("Hi ", data.FirstName, " " + data.LastName));
Console.ReadLine();
注意
上述方法中的屬性名或鍵名是區(qū)分大小寫的;即類的屬性名稱必須匹配 JSON 數(shù)據(jù)的鍵。
使用數(shù)據(jù)協(xié)定 Json 序列化程序類
.NET 框架還提供了用于對(duì) JSON 進(jìn)行序列化和反序列化的類。其中之一是 DataContractJsonSerializer
。使用以下代碼,我們可以反序列化 JSON 對(duì)象。要使用此方法,必須記住以下幾點(diǎn),
System.Runtime.Serialization
庫DataContract
修飾,屬性必須用 DataMember
屬性修飾WriteObject
方法序列化對(duì)象,使用 ReadObject
方法反序列化 JSON 對(duì)象。static void Main(string[] args)
{
string jsonData = "{ \"WebName\":\"卡卡網(wǎng)\",\"WebSite\":\"webkaka.com\" }";
DataContractJsonSerializerjsonSerializer = newDataContractJsonSerializer(typeof(MyDetail));
MemoryStream stream = newMemoryStream(Encoding.UTF8.GetBytes(jsonData));
stream.Position = 0;
MyDetaildataContractDetail = (MyDetail) jsonSerializer.ReadObject(stream);
Console.WriteLine(string.Concat("Hi ", dataContractDetail.WebName, " " + dataContractDetail.WebSite));
Console.ReadLine();
}
[DataContract]
public class MyDetail
{
[DataMember]
public string WebName {
get;
set;
}
[DataMember]
public string WebSite {
get;
set;
}
}
輸出
Hi 卡卡網(wǎng) webkaka.com
總結(jié)
使用上述方法,我們可以在 C# 代碼中解析 JSON 并從該對(duì)象中提取值。