.NET處理Json的幾種方式
序列化裡的xml,soap,binary在上一篇文章裡面已經說過了,這篇主要說json。
json是目前非常流行的一種序列化資料的方式,很多api都採用的是json,結構簡潔,容易理解,適用性強,逐漸代替之前的xml在各個資料傳輸和儲存的領域的使用,比如VS Code的配置檔案:
json格式的結構很簡單,分號隔開的鍵值堆構成,逗號隔開,{}表示物件,[]表示集合,值可以是數字,字串,布林,陣列,物件,null,其他的一些細節請看規範資料即可。
下面就說說json序列化的幾種方式:
JavaScriptSerializer類
需要給專案引用System.Web.Extensions.dll
,名稱空間是System.Web.Script.Serialization
序列化和反序列化的程式碼如下:
JavaScriptSerializer js = new JavaScriptSerializer();
string json = js.Serialize(p);
Console.WriteLine(json);
Console.WriteLine("Serialization Done");
Person new_p = js.Deserialize<Person>(json);
Console.WriteLine(new_p.Name);
DataContractJsonSerializer類
需要引用System.Runtime.Serialization.dll
System.Runtime.Serialization.Json
,被序列化的類需要加WCF資料契約一樣的特性來顯式宣告。
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public string Major { get; set; }
}
序列化程式碼如下:
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person));
MemoryStream ms = new MemoryStream();
js.WriteObject(ms,p);
ms.Position = 0;
string json = Encoding.Default.GetString(ms.ToArray());
Console.WriteLine(json);
MemoryStream ms_new = new MemoryStream(Encoding.Default.GetBytes(json));
Person pp = js.ReadObject(ms_new) as Person;
Console.WriteLine(pp.Name);
可以看出這個方式操作的是流,所以略微繁瑣一些。
Json.NET類庫,也就是大名鼎鼎的Newtonjson
Json.NEt類庫,地址https://www.newtonsoft.com/json
功能很多很強大,我這裡也只說一下最基本的。
直接通過Nuget可以安裝到專案中。
這是它的名稱空間,平常用到最多的是Newtonsoft.Json
這個。常用到的類是JsonConvert
工具類,方法DeserializeObject
,DeserializeObject<T>
,SerializeObject
。
直接上程式碼,很容易看,這種泛型方法可以直接轉換成物件:
var json = JsonConvert.SerializeObject(p);
Console.WriteLine(json);
var pp = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(pp.Name);
var jobj = JsonConvert.DeserializeObject(json) as JObject;
Console.WriteLine(jobj.GetType());
foreach (var item in jobj)
{
Console.WriteLine($"{item.Key}:{item.Value}");
}
而要將一個json結構很方便的轉換為C#類,有專門的轉化網站,但最簡單的還是VS的選擇性貼上功能。
使用方法是:新建一個空cs檔案,裡面的東西都刪除乾淨。然後複製json內容,選擇VS的編輯選單的選擇性貼上功能,裡面有將json貼上為類和將xml貼上為類,有些轉換過來不符合.NET規範的可以通過DataContract或者DAtaMemember進行註解。
當然,也可以直接使用dynamic型別來實現對應功能,優缺點其實也就是dynamic的優缺點。
var json = JsonConvert.SerializeObject(ps);
Console.WriteLine(json);
dynamic persons = JsonConvert.DeserializeObject<dynamic>(json);
foreach (var item in persons)
{
Console.WriteLine(item.Name);
}
轉載地址:https://www.cnblogs.com/newlifechou/p/8949377.html