.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工具類,方法DeserializeObjectDeserializeObject<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);
}

參考文章

在C#中,Json的序列化和反序列化的幾種方式總結

Json的序列化與反序列化

Json教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM