如今因爲項目需求(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:
- <SPAN style="FONT-FAMILY: KaiTi_GB2312; FONT-SIZE: 18px">//引用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());
- }
- } </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());
}
}
還有一種方法是:
- //定義一個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";
- }
//定義一個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,順着這個思路,發現變化如下:
- <SPAN style="FONT-FAMILY: KaiTi_GB2312; FONT-SIZE: 18px">JavaScriptArray--->JArray
- JavaScriptConvert--->JsonConvert
- JavaScriptObject--->JObject</SPAN>
JavaScriptArray--->JArray
JavaScriptConvert--->JsonConvert
JavaScriptObject--->JObject
其實這樣更改更規範吧!
下面介紹新版本Newtonsoft.Json.dll反序列化JSON字符串的方法
1.直接反序列化JSON字符串
- //引用序列化、反序列化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"]);
//引用序列化、反序列化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 添加一個類,定義一個對象
- 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;
- }
- }
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字符串
- //引用序列化、反序列化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字符串用到的空間
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這個工具!