使用Newtonsoft.Json.dll(JSON.NET)動態解析JSON、.net 的json的序列化與反序列化(一)

在開發中,我很是喜歡動態語言和匿名對象帶來的方便,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; }
    }

執行結果:

相關文章
相關標籤/搜索