本系列教程假設讀者已經對Json有一定的了解,關於Json在這里不多說.本系列教程希望能對讀者開發涉及到Json的.Net項目有一定的幫助.本系列教程是根據官方文檔資料和自己項目應用匯總而成.如果覺得本系列對你有用,望多多關注.本人還只是個未畢業的學生,水平有限,盡請指正.
Json.Net是一個讀寫Json效率比較高的.Net框架.Json.Net 使得在.Net環境下使用Json更加簡單。通過Linq To JSON可以快速的讀寫Json,通過JsonSerializer可以序列化你的.Net對象。讓你輕松實現.Net中所有類型(對象,基本數據類型等)和Json的轉換.
Json.Net目前的版本是4.5 下載
我們知道在.Net中內置了讀寫Json的對象(DataContractJsonSerializer,JavaScriptSerializer),為什么我們還要用Json.Net呢?
功能對比:
特性 | Json.Net | DataContractJsonSerializer | JavaScriptSerializer |
Json | 支持 | 支持 | 支持 |
Bson | 支持 | 不支持 | 不支持 |
Json Schema | 支持 | 不支持 | 不支持 |
.Net 2.0 | 支持 | 不支持 | 不支持 |
.Net 3.5 | 支持 | 支持 | 支持 |
.Net 4.0 | 支持 | 支持 | 支持 |
Silverlight | 支持 | 支持 | 不支持 |
Windows Phone | 支持 | 支持 | 不支持 |
Windows 8 Metro | 支持 | 支持 | 不支持 |
Linq to Json | 支持 | 不支持 | 不支持 |
Indented Json(有換行格式的Json) | 支持 | 不支持 | 不支持 |
Json和XML轉換 | 支持 | 不支持 | 不支持 |
序列化DataTable和DataSet | 支持 | 不支持 | 不支持 |
序列化Entity Framework | 支持 | 不支持 | 不支持 |
性能對比:
下面通過一個實例來展示它在項目的應用.下面的例子是通過Ajax和Json顯示所有用戶的列表信息.
准備: 創建一個Web項目,本應用程序是通過VS2010創建的.並添加引用Newtonsoft.Json.dll
1.首先創建一個Person對象
/// <summary> /// 包含用戶的基本信息 /// </summary> public class Person { /// <summary> /// 獲取或設置用戶名 /// </summary> public string Name { get; set; } /// <summary> /// 獲取或設置用戶年齡 /// </summary> public int Age { get; set; } /// <summary> /// 獲取或設置用戶性別 /// </summary> public string Gender { get; set; } /// <summary> /// 獲取或設置用戶國籍 /// </summary> public string Country { get; set; } /// <summary> /// 獲取或設置用戶電子郵箱 /// </summary> public string Email { get; set; } }
2.創建用戶操作類PersonRepository,用來對Person的操作,本例中僅僅用來獲取Person對象列表
/// <summary> /// 用戶操作類 /// </summary> public class PersonRepository { /// <summary> /// 獲取用戶列表 /// </summary> /// <returns>所有用戶信息</returns> public static List<Person> GetPersons() { List<Person> ps = new List<Person>(); Person p1 = new Person { Name = "Tom", Age = 32, Country = "US", Gender = "Male", Email = "tom@gmail.com" }; Person p2 = new Person { Name = "Jack", Age = 23, Country = "UK", Gender = "Male", Email = "jack@gmail.com" }; Person p3 = new Person { Name = "Eden", Age = 25, Country = "Canada", Gender = "Female", Email = "eden@gmail.com" }; Person p4 = new Person { Name = "Li Hua", Age = 29, Country = "China", Gender = "Male", Email = "lihui@163.com" }; Person p5 = new Person { Name = "Lvo", Age = 40, Country = "US", Gender = "Male", Email = "lvo@gmail.com" }; ps.Add(p1); ps.Add(p2); ps.Add(p3); ps.Add(p4); ps.Add(p5); return ps; } }
3.添加一個一般處理程序,我將其命名為PersonHandler.ashx,引入命名空間"using Newtonsoft.Json",修改ProcessRequest函數中的代碼如下:
/// <summary> /// 處理用戶類的請求 /// </summary> public class PersonHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { List<Person> persons = PersonRepository.GetPersons(); string json = JsonConvert.SerializeObject(persons); context.Response.Write(json); } public bool IsReusable { get { return false; } } }
通過Json.Net來序列化對象,可以通過
string json = JsonConvert.SerializeObject(Object obj); |
還可以通過JsonSerializer來實現
JsonSerializer serializer = new JsonSerializer(); StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); JsonWriter writer = new JsonTextWriter(sw); serializer.Serialize(writer, persons); string json = sb.ToString();
這兩種方式有什么聯系和區別呢?
實際上,JsonConvert.SerializerObject內部就是通過JsonSerializer來實現的.
public static string SerializeObject(object value, Formatting formatting, JsonSerializerSettings settings) { JsonSerializer jsonSerializer = JsonSerializer.Create(settings); StringBuilder sb = new StringBuilder(0x100); StringWriter sw = new StringWriter(sb, CultureInfo.InvariantCulture); using (JsonTextWriter jsonWriter = new JsonTextWriter(sw)) { jsonWriter.Formatting = formatting; jsonSerializer.Serialize(jsonWriter, value); } return sw.ToString(); }
區別在於JsonSerializer序列化時,你可以選擇用JsonWriter也可以選擇TextWriter.而JsonConvert只是默認使用JsonTextWriter.
4.添加一個Html網頁,網頁的內容僅僅用來顯示用戶的基本信息
<div> <table border="1"> <thead> <tr> <td> 用戶名 </td> <td> 年齡 </td> <td> 性別 </td> <td> 國籍 </td> <td> 電子郵箱 </td> </tr> </thead> <tbody id="personBody"> </tbody> </table> </div>
5.添加javascript代碼,實現Ajax請求.首先要在頭文件中引入JQuery
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function () { $.getJSON("PersonHandler.ashx", function (data, status) { if (status == "success") { $.each(data, function (index, item) { var beginTag = "<tr><td>"; var endTag = "</td></tr>"; var tag = "</td><td>"; $("#personBody").append($(beginTag + item.Name + tag + item.Age + tag + item.Gender + tag + item.Country + tag + item.Email + endTag)); }); } }); }); </script>
$.getJSON可以進行異步Ajax請求,並可以直接返回JSON對象
jQuery.getJSON(url,data,success(data,status,xhr)) |
參數說明
參數 | 描述 |
url | 必需。規定將請求發送的哪個 URL。 |
data | 可選。規定連同請求發送到服務器的數據。 |
success(data,status,xhr) | 可選。規定當請求成功時運行的函數。 額外的參數:
|
運行效果: