Newtonsoft.Json.dll 反序列化JSON字串 .
阿新 • • 發佈:2019-01-22
上一篇JSON部落格《JSON入門級學習小結--JSON資料結構》中已對JSON做了簡單介紹,JSON字串陣列資料樣式大概是這樣子的:
1.對Newtonsoft.Json.dll新增引用
還有一種方法是: [csharp] view plaincopyprint?
我感覺這兩種反序列化JSON的方法都挺好,其實還用很多方式可以反序列化JSON,本文僅僅藉助了Newtonsoft.Json.dll這個工具!
如今因為專案需求(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?- <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());
}
}
還有一種方法是: [csharp] view plaincopyprint?
- //定義一個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,順著這個思路,發現變化如下:
[csharp] view plaincopyprint?- <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字串
[csharp] view plaincopyprint?- //引用序列化、反序列化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 新增一個類,定義一個物件
[csharp] view plaincopyprint?- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- /// <summary>
- ///Customer 的摘要說明
- /// </summary>
- publicclass Customer
- {
- //在序列化前後沒有變動
- publicstring a
- { get; set; }
- //在序列化前後設定和重置
- publicstring b
- { get; set; }
- //設定為null,但在序列化後填充
- publicstring c
- { get; set; }
- publicstring 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字串
[csharp] view plaincopyprint?- //引用序列化、反序列化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這個工具!