|
|
|
|
|
JSON(JavaScript 對象表示法)是一種輕量級數(shù)據(jù)交換格式。它獨立于語言,易于理解和自我描述。它被用作 XML 的替代品。
JSON 表示結構化文本格式的對象和存儲在鍵值對中的數(shù)據(jù),在C#代碼中使用 JSON 的方法有很多種,本文介紹幾種常用的方法。
使用 JsonSerializer.Deserialize
在.NET中,System.Text.Json
命名空間提供了一個類JsonSerializer
,它有兩個靜態(tài)方法,JsonSerializer.Serialize
和JsonSerializer.Deserialize
。JsonSerializer.Deserialize
方法用于將 JSON 字符串解析為對象并讀取其成員值。
下面是一個用于創(chuàng)建 JSON 數(shù)據(jù)的 C# 對象示例。
public class CSharpMember
{
public string Name { get; set; }
public string Bio { get; set; }
public DateTime JoinDate { get; set; }
public bool Author { get; set; }
}
為上述對象創(chuàng)建的 JSON 字符串如下所示。
// 獲得JSON字符串
string jsonMemberString = "{\"Name\":\"Mahesh Chand\",\"Bio\":\"Software developer\"," +
"\"JoinDate\":\"2000-01-01T00:00:00-00:00\",\"Author\":true}";
你可以調用 JsonSerializer.Deserialize
方法將字符串反序列化為對象。
// 將JSON字符串反序列化為對象
CSharpMember member = JsonSerializer.Deserialize<CSharpMember>(jsonMemberString);
一旦 JSON 字符串被反序列化為一個對象,現(xiàn)在就可以很容易地通過對象成員讀取它的值。
// 使用對象成員讀取/解析數(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 的內置 JSON 序列化快得多。
JsonConvert
類有一個與 JSON 字符串相互轉換的方法,分別是 SerializeObject()
和 DeserializeObject()
。它可以用在我們不想與 JSON 字符串相互轉換的地方。
在下面的示例中,我使用“JsonConvert.DeserializeObject
”方法將我的 JSONobject 轉換為我的自定義類對象。這里的 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 字符串并將其轉換為鍵值字典對象。在下面的示例中,我使用了“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
方法輸出分配給動態(tài)對象并將訪問值作為動態(tài)對象的屬性。
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 框架還提供了用于對 JSON 進行序列化和反序列化的類。其中之一是 DataContractJsonSerializer
。使用以下代碼,我們可以反序列化 JSON 對象。要使用此方法,必須記住以下幾點,
System.Runtime.Serialization
庫DataContract
修飾,屬性必須用 DataMember
屬性修飾WriteObject
方法序列化對象,使用 ReadObject
方法反序列化 JSON 對象。static void Main(string[] args)
{
string jsonData = "{ \"WebName\":\"卡卡網\",\"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 卡卡網 webkaka.com
總結
使用上述方法,我們可以在 C# 代碼中解析 JSON 并從該對象中提取值。