Json.Net系列教程 1.Json.Net介紹及實例


本系列教程假設讀者已經對Json有一定的了解,關於Json在這里不多說.本系列教程希望能對讀者開發涉及到Json的.Net項目有一定的幫助.本系列教程是根據官方文檔資料和自己項目應用匯總而成.如果覺得本系列對你有用,望多多關注.本人還只是個未畢業的學生,水平有限,盡請指正.

.Json.Net有什么用?

  Json.Net是一個讀寫Json效率比較高的.Net框架.Json.Net 使得在.Net環境下使用Json更加簡單。通過Linq To JSON可以快速的讀寫Json,通過JsonSerializer可以序列化你的.Net對象。讓你輕松實現.Net中所有類型(對象,基本數據類型等)和Json的轉換.

  Json.Net目前的版本是4.5 下載

二.為什么要用Json.Net?

  我們知道在.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)

可選。規定當請求成功時運行的函數。

額外的參數:

  • response - 包含來自請求的結果數據
  • status - 包含請求的狀態
  • xhr - 包含 XMLHttpRequest 對象

 

 

 

 

 

 

 

 

 

運行效果:

 


免責聲明!

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



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