寫在開頭:
最近項目需求,需要在C#中處理json字符串,毫不猶豫的下載了Newtonsoft.Json 4.5.11(2012.12.17)http://json.codeplex.com/,然后百度教程,還比較多(心喜),大致方法類似如下:
- using Newtonsoft.Json;
- using System.Text;
- StringBuilder sb = new StringBuilder();
- string str = "[{ID:'1',Name:'John',Other:[{Age:'21',Sex:'0'}]},{ID:'2',Name:'Good',Other:[{Age:'36',Sex:'1'}]}]";
- JavaScriptArray javascript = (JavaScriptArray)JavaScriptConvert.DeserializeObject(str);
- 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());
- JavaScriptArray json = (JavaScriptArray)obj["Other"];
- 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());
- }
- }
還有一種方法是:
- string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";
- JsonReader reader = new JsonReader(new StringReader(jsonText));
- while (reader.Read())
- {
- textBox1.Text += "TokenType = " + reader.TokenType + " ValueType = " + reader.ValueType + " Value = " + reader.Value + "\r\n";
- }
第一種方法編譯直接出錯,根本不識別JavaScriptArray,JavaScriptObject,就連JavaScriptConvert方法也木有,靠!那好吧,第二種總行了吧,提示:
錯誤 2 無法創建抽象類或接口“Newtonsoft.Json.JsonReader”的實例
這是要鬧哪樣???
后面查看了Newtonsoft.Json庫中的方法,根本沒有嘛!再百度,終於有位仁兄說在新版中JavaScriptArray變成了JArray,順着這個思路,發現變化如下:
- JavaScriptArray--->JArray
- JavaScriptConvert--->JsonConvert
- JavaScriptObject--->JObject
仔細看看,人家這樣改更規范了嘛!
使用方法總結:
1、較簡單的一種
- using Newtonsoft.Json;
- using Newtonsoft.Json.Linq;
- string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";
- JArray ja =(JArray) JsonConvert.DeserializeObject(jsonText);
- JObject o = (JObject)ja[1];
- Console.WriteLine(o["a"]);
- Console.WriteLine(ja[1]["a"]);
2、自定義對象列表
定義一個對象:
- 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;
- }
- }
反序列化json字符串:
- using Newtonsoft.Json;
- using Newtonsoft.Json.Linq;
- string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";
- List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(jsonText);
- Console.WriteLine(_list[1].a);
- foreach (Customer c in _list)
- {
- Console.WriteLine(c.c);
- }
我感覺兩種方法各有好處,第二種雖然需要再寫一個對象,但可以像在js里面一樣使用,感覺很爽!