[轉貼] 使用 ServiceStack.Text 序列化 json

2013081910:47
出處:http://www.lidongkui.com/use-servicestack-text-to-serialize-json

相信做 .net 開發的朋友經常會遇到 json 序列化這樣的需要,今天發篇文章總結下自己使用 ServiceStack.Text 來序列化 json。它的速度比 Newtonsoft.Json 快很多,在測試時發現比 fastJson 還快些。

首先,我們有下邊兩個類,一個是職員(Staff)類,一個是聯系方式(Contact)類:

public class Staff
{
   
public long ID { get; set; }
   
public string Name { get; set; }
   
public int Age { get; set; }
}

public class Contact
{
   
public long StaffID { get; set; }
   
public string Email { get; set; }
}

首先,我們添加兩個職員:

List<Staff> listStaff = new List<Staff>();
listStaff
.Add(new Staff() { ID = 2, Name = "小李" });
listStaff
.Add(new Staff() { ID = 3, Name = "小王" });

按以前很多人序列化 json 的方式:

var result = "[";
foreach (var staff in listStaff)
{
    result
+= "{\"ID\":\"" + staff.ID + "\",\"Name\":\"" + staff.Name + "\"},";
}
result
= result.Substring(0, result.Length - 1);
result
+= "]";

最終 json 如下:

[
   
{
       
"ID": "2",
       
"Name": "小李"
   
},
   
{
       
"ID": "3",
       
"Name": "小王"
   
}
]

使用這種方式是可以的,但有幾個缺點:1.代碼顯得雜亂,易出錯。2.需要自己對特殊字符進行轉義,如雙引號等,否則 json 序列化將失敗。下邊看看使用 ServiceStack.Text 來序列化 json。

我們需要下載 ServiceStack.Text.dll,將它引用到我們的項目中,並引用 ServiceStack.Text 命名空間。下邊先看看單個類對象的序列化:

Staff staff = new Staff() { ID = 1, Name = "xiaozhao" };
var result = staff.ToJson();

這樣得到的 json 如下:

{
   
"ID": 1,
   
"Name": "xiaozhao",
   
"Age": 0
}

細心的朋友會發現,我們在輸出中並不打算使用 Age 屬性,但這裡卻輸出了 Age,為解決這個問題,我們有下邊方法。

1.使用 JsonObject 類,它繼承自Dictionary<string, string> ,使得我們可以如下來輸出我們想要的屬性。

Staff staff = new Staff() { ID = 1, Name = "xiaozhao" };

JsonObject json = new JsonObject();
json
.Add("ID", staff.ID.ToString());
json
.Add("Name", staff.Name);

var result = json.ToJson();

這樣得到下邊的結果[結果一],達到了我們的目的。

{
   
"ID": 1,
   
"Name": "xiaozhao"
}

2.在項目中添加 System.Runtime.Serialization ,並引用命名空間 System.Runtime.Serialization。

我們可以在屬性上邊指明要序列化的屬性,如下:

[DataContract]
public class Staff
{
   
[DataMember]
   
public long ID { get; set; }
   
[DataMember]
   
public string Name { get; set; }
   
public int Age { get; set; }
}

或者:

public class Staff
{
   
public long ID { get; set; }
   
public string Name { get; set; }
   
[IgnoreDataMember]
   
public int Age { get; set; }
}

這樣下邊的代碼輸出的結果就變得和[結果一]相同了。

Staff staff = new Staff() { ID = 1, Name = "xiaozhao" };
var result = staff.ToJson();

最後,我們看下類對象集合的序列化,我們添加職員的聯系方式如下:

List<Contact> listContact = new List<Contact>();
listContact
.Add(new Contact() { StaffID = 3, Email = "[email protected]" });
listContact
.Add(new Contact() { StaffID = 4, Email = "[email protected]" });

每個職員可能對應一個聯系方式,這裡要考慮有的職員沒有聯系方式的情況,直接給出代碼:

List<string> list = new List<string>();
foreach (var staff