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

上一篇JSON博客JSON入門級學習小結--JSON數據結構中已對JSON做了簡單介紹,JSON字符串數組數據樣式大概是這樣子的:

    

    

    如今因爲項目需求(asp.net web網站,前臺向後臺傳遞JSON數據,並對JSON數據處理,詳述見博客《 

《項目經驗》--通過js獲取前臺數據向一般處理程序傳遞Json數據,並解析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:

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

還有一種方法是:

  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.     
  10.     }    
//定義一個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,順着這個思路,發現變化如下:

      

  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字符串

      

  1. //引用序列化、反序列化JSON字符串用到的空間   
  2. using Newtonsoft.Json;    
  3. using Newtonsoft.Json.Linq;   
  4.    
  5.  //定義一個JSON字符串    
  6. string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";    
  7. //反序列化JSON字符串   
  8. JArray ja =(JArray) JsonConvert.DeserializeObject(jsonText);   
  9.  //將反序列化的JSON字符串轉換成對象   
  10. JObject o = (JObject)ja[1];    
  11. //讀取對象中的各項值   
  12. Console.WriteLine(o["a"]);    
  13. 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 添加一個類,定義一個對象

    

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.   
  6. /// <summary>     
  7. ///Customer 的摘要說明     
  8. /// </summary>     
  9. public class Customer  
  10. {  
  11.     //在序列化前後沒有變動     
  12.     public string a  
  13.     { getset; }  
  14.     //在序列化前後設置和重置     
  15.     public string b  
  16.     { getset; }  
  17.     //設置爲null,但在序列化後填充     
  18.     public string c  
  19.     { getset; }  
  20.     public string Other  
  21.     { getset; }  
  22.     public Customer()  
  23.     {  
  24.         //     
  25.         //TODO: 在此處添加構造函數邏輯     
  26.         //     
  27.         a = "";  
  28.         b = "";  
  29.         c = "";  
  30.         Other = null;  
  31.     }  
  32. }  
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字符串

   

  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這個工具! 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章