1. 程式人生 > >Newtonsoft.Json.dll 反序列化JSON字串 .

Newtonsoft.Json.dll 反序列化JSON字串 .

上一篇JSON部落格JSON入門級學習小結--JSON資料結構中已對JSON做了簡單介紹,JSON字串陣列資料樣式大概是這樣子的:

    

    如今因為專案需求(asp.net web網站,前臺向後臺傳遞JSON資料,並對JSON資料處理,詳述見部落格《

》),需要對傳遞的JSON資料反序列化。於是從網上找了許多JSON反序列化的例子,最終決定使用Newtonsoft.Json.dll 反序列化JSON字串,當然它也可以序列化JSON字串,Newtonsoft.Json.dll下載連結

使用Newtonsoft.Json.dll反序列化JSON字串的步驟:

    1.對Newtonsoft.Json.dll新增引用

     將Newtonsoft.Json.dll檔案拷貝至介面層的Bin目錄下,然後右擊Bin,彈出“新增引用”頁,然後點選“瀏覽”,然後找到介面層的Bin資料夾,找到Newtonsoft.Json.dll檔案,然後點選"新增",引用新增成功!

     

    2.在需要對JSON字串處理的介面,引用JSON空間,並對JSON進行處理

      網上解決辦法大致如下:

     方法1:

[csharp] view plaincopyprint?
  1. <SPAN style="FONT-FAMILY: KaiTi_GB2312; FONT-SIZE: 18px">//引用JSON解析使用的空間
  2. using Newtonsoft.Json;      
  3. using System.Text;    
  4. //定義一個可變字串陣列
  5. StringBuilder sb = new StringBuilder();  
  6. //定義一個JSON字串str
  7. string str = "[{ID:'1',Name:'John',Other:[{Age:'21',Sex:'0'}]},{ID:'2',Name:'Good',Other:[{Age:'36',Sex:'1'}]}]";  
  8. //反序列化JSON資料
  9. JavaScriptArray javascript = (JavaScriptArray)JavaScriptConvert.DeserializeObject(str);  
  10. //依次讀取反序列化的JSON資料,並將各資料寫入可變字串陣列中
  11. for (int i = 0; i < javascript.Count; i++)  
  12. {  
  13. //
  14.     JavaScriptObject obj = (JavaScriptObject)javascript[i];  
  15. //可變字串陣列新增資料
  16.     sb.Append("ID:" + obj["ID"].ToString());  
  17.     sb.Append("Name:" + obj["Name"].ToString());  
  18. //反序列化JSON資料
  19.     JavaScriptArray json = (JavaScriptArray)obj["Other"];  
  20. //依次讀取反序列化的JSON資料,並將各資料寫入可變字串陣列中
  21. for (int j = 0; j < json.Count; j++)  
  22.     {  
  23.         JavaScriptObject jsonobj = (JavaScriptObject)json[j];  
  24.         sb.Append("Age:" + jsonobj["Age"].ToString());  
  25.         sb.Append("Sex:" + jsonobj["Sex"].ToString());  
  26.     }  
  27. }      </SPAN>  
//引用JSON解析使用的空間
using Newtonsoft.Json;    
using System.Text;  
  
//定義一個可變字串陣列
StringBuilder sb = new StringBuilder();
//定義一個JSON字串str
string str = "[{ID:'1',Name:'John',Other:[{Age:'21',Sex:'0'}]},{ID:'2',Name:'Good',Other:[{Age:'36',Sex:'1'}]}]";
//反序列化JSON資料
JavaScriptArray javascript = (JavaScriptArray)JavaScriptConvert.DeserializeObject(str);
//依次讀取反序列化的JSON資料,並將各資料寫入可變字串陣列中
for (int i = 0; i < javascript.Count; i++)
{
    //
    JavaScriptObject obj = (JavaScriptObject)javascript[i];
    //可變字串陣列新增資料
    sb.Append("ID:" + obj["ID"].ToString());
    sb.Append("Name:" + obj["Name"].ToString());
    //反序列化JSON資料
    JavaScriptArray json = (JavaScriptArray)obj["Other"];
            
    //依次讀取反序列化的JSON資料,並將各資料寫入可變字串陣列中
    for (int j = 0; j < json.Count; j++)
    {
        JavaScriptObject jsonobj = (JavaScriptObject)json[j];
        sb.Append("Age:" + jsonobj["Age"].ToString());
        sb.Append("Sex:" + jsonobj["Sex"].ToString());
    }
}      

還有一種方法是: [csharp] view plaincopyprint?
  1. //定義一個JSON字串str  
  2. string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";    
  3. //反序列化JSON資料
  4. JsonReader reader = new JsonReader(new StringReader(jsonText));    
  5. //依次讀取反序列化的JSON資料
  6. while (reader.Read())    
  7.     {    
  8.         textBox1.Text += "TokenType = " + reader.TokenType + "   ValueType =  " + reader.ValueType + "   Value = " + reader.Value + "\r\n";    
  9.     }    
//定義一個JSON字串str  
string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";  
 //反序列化JSON資料
JsonReader reader = new JsonReader(new StringReader(jsonText));  
  //依次讀取反序列化的JSON資料
    while (reader.Read())  
    {  
        textBox1.Text += "TokenType = " + reader.TokenType + "   ValueType =  " + reader.ValueType + "   Value = " + reader.Value + "\r\n";  
  
    }  

第一種方法編譯直接出錯,根本不識別JavaScriptArray,JavaScriptObject,就連JavaScriptConvert方法也木有!那好吧,第二種總行了吧,提示:

     錯誤 2 無法建立抽象類或介面“Newtonsoft.Json.JsonReader”的例項

       這是怎麼回事???

       後來在搜到的文章中,發現新版中JavaScriptArray變成了JArray,順著這個思路,發現變化如下:

[csharp] view plaincopyprint?
  1. <SPAN style="FONT-FAMILY: KaiTi_GB2312; FONT-SIZE: 18px">JavaScriptArray--->JArray    
  2. JavaScriptConvert--->JsonConvert    
  3. JavaScriptObject--->JObject</SPAN>  
JavaScriptArray--->JArray  
JavaScriptConvert--->JsonConvert  
JavaScriptObject--->JObject

   其實這樣更改更規範吧!

下面介紹新版本Newtonsoft.Json.dll反序列化JSON字串的方法

    1.直接反序列化JSON字串

[csharp] view plaincopyprint?
  1. //引用序列化、反序列化JSON字串用到的空間
  2. using Newtonsoft.Json;    
  3. using Newtonsoft.Json.Linq;   
  4. //定義一個JSON字串 
  5. string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";    
  6. //反序列化JSON字串
  7. JArray ja =(JArray) JsonConvert.DeserializeObject(jsonText);   
  8. //將反序列化的JSON字串轉換成物件
  9. JObject o = (JObject)ja[1];    
  10. //讀取物件中的各項值
  11. Console.WriteLine(o["a"]);    
  12. Console.WriteLine(ja[1]["a"]);    
//引用序列化、反序列化JSON字串用到的空間
using Newtonsoft.Json;  
using Newtonsoft.Json.Linq; 
 
 //定義一個JSON字串 
string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";  
//反序列化JSON字串
JArray ja =(JArray) JsonConvert.DeserializeObject(jsonText); 
 //將反序列化的JSON字串轉換成物件
JObject o = (JObject)ja[1];  
//讀取物件中的各項值
Console.WriteLine(o["a"]);  
Console.WriteLine(ja[1]["a"]);  

    2.定義物件列表,然後反序列化JSON字串

      2.1 新增一個類,定義一個物件

[csharp] view plaincopyprint?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. /// <summary>  
  6. ///Customer 的摘要說明  
  7. /// </summary>  
  8. publicclass Customer  
  9. {  
  10. //在序列化前後沒有變動  
  11. publicstring a  
  12.     { getset; }  
  13. //在序列化前後設定和重置  
  14. publicstring b  
  15.     { getset; }  
  16. //設定為null,但在序列化後填充  
  17. publicstring c  
  18.     { getset; }  
  19. publicstring Other  
  20.     { getset; }  
  21. public Customer()  
  22.     {  
  23. //  
  24. //TODO: 在此處新增建構函式邏輯  
  25. //  
  26.         a = "";  
  27.         b = "";  
  28.         c = "";  
  29.         Other = null;  
  30.     }  
  31. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>  
///Customer 的摘要說明  
/// </summary>  
public class Customer
{
    //在序列化前後沒有變動  
    public string a
    { get; set; }
    //在序列化前後設定和重置  
    public string b
    { get; set; }
    //設定為null,但在序列化後填充  
    public string c
    { get; set; }
    public string Other
    { get; set; }
    public Customer()
    {
        //  
        //TODO: 在此處新增建構函式邏輯  
        //  
        a = "";
        b = "";
        c = "";
        Other = null;
    }
}

     2.2 反序列化JSON字串

[csharp] view plaincopyprint?
  1. //引用序列化、反序列化JSON字串用到的空間
  2. using Newtonsoft.Json;    
  3. using Newtonsoft.Json.Linq;   
  4. //定義一個JSON字串 
  5. string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";    
  6. //反序列化JSON字串,將JSON字串轉換成LIST列表
  7. List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(jsonText);    
  8. //讀取列表中的值
  9. Console.WriteLine(_list[1].a);    
  10. foreach (Customer c in _list)    
  11. {    
  12.     Console.WriteLine(c.c);    
  13. }   
//引用序列化、反序列化JSON字串用到的空間
using Newtonsoft.Json;  
using Newtonsoft.Json.Linq; 
//定義一個JSON字串 
string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";  
//反序列化JSON字串,將JSON字串轉換成LIST列表
List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(jsonText);  
//讀取列表中的值
Console.WriteLine(_list[1].a);  
foreach (Customer c in _list)  
{  
    Console.WriteLine(c.c);  
} 

    我感覺這兩種反序列化JSON的方法都挺好,其實還用很多方式可以反序列化JSON,本文僅僅藉助了Newtonsoft.Json.dll這個工具!