序列化里的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);
}
參考文章