在開發中,我很是喜歡動態語言和匿名對象帶來的方便,JSON.NET具備動態序列化和反序列化任意JSON內容的能力,沒必要將它映射到具體的強類型對象,它能夠處理不肯定的類型(集合、字典、動態對象和匿名對象),在這篇文章中我將經過JToken、JObject和JArray來動態解析JSON對象,使它很容易建立和檢索的JSON內容而無需基礎類型。經過JObject和JArray建立JSON對象咱們先用很是簡單的方法來動態建立一些JSON,可經過JToken派生的JSON.NET對象來進行,最多見的JToken派生的類是JObject和JArray。
由於JToken實現了IDynamicMetaProvider動態語言接口,因此可使用dynamic關鍵字直觀地建立動態對象,並把這個動態對象序列化爲JSON字符串。 git
Newtonsoft.Json的地址:github
官網:http://json.codeplex.com/json
源碼地址:https://github.com/JamesNK/Newtonsoft.Jsonide
Newtonsoft.Json.dll下載:https://github.com/JamesNK/Newtonsoft.Json/releasesspa
例子一、
經過JArray和JObject來建立一個音樂專輯結構的一個示例:code
//Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject {{"Entered", DateTime.Now}}; Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject(); jsonObject.Add("Entered", DateTime.Now); dynamic album = jsonObject; album.AlbumName = "Dirty Deeds Done Dirt Cheap"; album.Artist = "AC/DC/DVD"; album.YearReleased = DateTime.Now.Year; album.Songs = new Newtonsoft.Json.Linq.JArray() as dynamic; dynamic song = new Newtonsoft.Json.Linq.JObject(); song.SongName = "Dirty Deeds Done Dirt Cheap"; song.SongLength = "4:05"; album.Songs.Add(song); song = new Newtonsoft.Json.Linq.JObject(); song.SongName = "Love at First Feel"; song.SongLength = "3:01"; album.Songs.Add(song); song = new Newtonsoft.Json.Linq.JObject(); song.SongName = "小蘋果"; song.SongLength = "03:32"; album.Songs.Add(song); Console.WriteLine(album.ToString()); Console.ReadLine();
以上代碼最重要的是沒有明確指定類型,即可將動態對象進行JSON序列化,而JObject對象只是接收數據,具體結構經過動態語言在運行時生成,這意味着此代碼能夠在運行時被編譯,從而體現動態語言的優點。序列化的結果以下圖所示:orm
例子二、對象
//Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject {{"Entered", DateTime.Now}}; Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject(); jsonObject.Add("Entered", DateTime.Now); dynamic album = jsonObject; album.AlbumName = "非主流歌曲"; foreach (var item in jsonObject) //循環輸出動態的值 JObject(基類爲JContainer、JObject和JArray)是一個集合,實現了IEnumerable接口,所以你還能夠輕鬆地在運行時循環訪問 { Console.WriteLine(item.Key + "的值爲:" + item.Value.ToString()); }
執行結果爲:blog
例子3:接口
JObject.Parse()和JArray.Parse()方法導入JSON格式,JToken結構支持Parse()和Load()方法,這兩個方法能夠分別從字符串或各類流讀取JSON數據。JValue包括最核心的JSON 解析能力,支持將字符串轉化爲咱們熟悉的動態對象。將JSON字符串轉換爲成JObject對象,並強制轉換爲動態類型。
var jsonString = @"{""Name"":""小蘋果"",""Company"":""韓國公司"", ""Entered"":""2016-11-26 00:14""}"; dynamic json = Newtonsoft.Json.Linq.JToken.Parse(jsonString) as dynamic; string name = json.Name; string company = json.Company; DateTime entered = json.Entered; Console.WriteLine("name:"+name); Console.WriteLine("company:" + company); Console.WriteLine("entered:" + entered);
執行結果:
例子4:
將JObject和JArray實例映射到一個強類型的對象,因此你能夠在同一段代碼中混合書寫動態和靜態類型
string jsonString1 = @"[{""Name"":""小蘋果"",""Age"":""20""},{""Name"":""演員"",""Age"":""2""}]"; Newtonsoft.Json.Linq.JArray userAarray1 = Newtonsoft.Json.Linq.JArray.Parse(jsonString1) as Newtonsoft.Json.Linq.JArray; List<User> userListModel = userAarray1.ToObject<List<User>>(); foreach (var userModel1 in userListModel) { Console.WriteLine("Name:" + userModel1.Name); Console.WriteLine("Age:" + userModel1.Age); } Console.WriteLine(""); string jsonString = @"[{""Name"":""小蘋果"",""Age"":""20""}]"; Newtonsoft.Json.Linq.JArray userAarray = Newtonsoft.Json.Linq.JArray.Parse(jsonString) as Newtonsoft.Json.Linq.JArray; Newtonsoft.Json.Linq.JObject jObject = userAarray[0] as Newtonsoft.Json.Linq.JObject; User userModel = jObject.ToObject<User>(); Console.WriteLine("Name:" + userModel.Name); Console.WriteLine("Age:" + userModel.Age);
public class User { public string Name { set; get; } public int Age { set; get; } }
執行結果:
例子五、
JSON.NET對動態語言的支持,但也別忘了它對靜態類型的強大支持,關於如何序列化和反序列化強類型對象,JsonConvert是一個高級別的靜態類,包裝更低級別的功能,但你也可使用JsonSerializer類,該類能夠序列化和反序列化各類流
UserType album = new UserType() { Type = "普通用戶", UserListModel = new List<User>() { new User() { Name="張三", Age = 20 }, new User() { Name="李四", Age = 30 } } }; // serialize to string string json2 = Newtonsoft.Json.JsonConvert.SerializeObject(album, Newtonsoft.Json.Formatting.Indented); Console.WriteLine("序列化結果"); Console.WriteLine(""); Console.WriteLine(json2); UserType userType = Newtonsoft.Json.JsonConvert.DeserializeObject<UserType>(json2); Console.WriteLine(""); Console.WriteLine("反序列化:"); Console.WriteLine("Type:"+ userType.Type); Console.WriteLine(""); foreach (var userModel in userType.UserListModel) { Console.WriteLine("Name:"+userModel.Name); Console.WriteLine("Age:" + userModel.Age); }
public class UserType { public string Type { get; set; } public List<User> UserListModel { get; set; } } public class User { public string Name { set; get; } public int Age { set; get; } }
執行結果: