Json序列化之.NET開源類庫Newtonsoft.Json的研究


 一、Json簡介

  JSON(全稱為JavaScript Object Notation) 是一種輕量級的數據交換格式。它是基於JavaScript語法標准的一個子集。 JSON采用完全獨立於語言的文本格式,可以很容易在各種網絡、平台和程序之間傳輸。JSON的語法很簡單,易於人閱讀和編寫,同時也易於機器解析和生成。

JSON與XML的比較
◆ 可讀性
  JSON和XML的可讀性相比較而言,由於XML提供輔助的標簽,更加適合人閱讀和理解。
◆ 文件大小與傳輸
  XML允許使用方便的標簽,所以文件尺寸是要比JSON大的。而且JSON源於Javascript,所以天生的主戰場是Javascript與網絡,在這里,JSON有着XML無法趕超的優勢。
  
JSON語法
1、 JSON 語法是 JavaScript 對象表示法語法的子集。
   • 數據在名稱/值對中:名稱是字符串,使用雙引號表示。值可以是:數字(整數或浮點數),字符串(在雙引號中),數組(在方括號中),對象(在花括號中), true / false / null
  • 數據由逗號分隔:
  • 花括號保存對象:對象可以包含各種數據,包括數組。
  • 方括號保存數組:數字可以包含對象。
  
例如:
{
     "student" : [
         {
             "firstName" : "Bill" ,
             "lastName" : "Gates"
         },
         {
             "grade" : "3" ,
             "sex" : "boy"
         }
     ]
}
 
 二、Json的序列化和反序列化
 
方式一:從頭開始,自己寫方法
  Json的格式並不復雜,序列化和反序列化我們完全可以自己來寫一套方法來處理Json。但是如果沒有特殊業務需求,沒有人會這樣做,畢竟隨着項目的推進,這個方法可能會變得越來越復雜。
 
方法二:使用開源類庫
  下面跟大家推薦一款.NET中開源的Json序列化和反序列化類庫,Newtonsoft.Json(下載地址 http://json.codeplex.com/)。打開網站如下:
 
點擊Download,即可下載次類庫。下載完成后,解壓完成后可以看到如下目錄:
打開Bin目錄,會看到不同版本的dll文件,這里我選擇Net40,復制Newtonsoft.Json.dll和Newtonsoft.Json.xml到項目下面。最常用的是JObject, JsonReader, JsonWriter來處理Json字符串,這幾種方式比較靈活。下面我們來建一個項目來介紹一下Newtonsoft.Json的具體用法。
 
 
 三、實戰Json序列化和反序列化
 
1、解析Json(反序列化)
 
  打開VS,新建控制台項目JsonWithNewtonsoft,這里我用的是VS2013,然后建立文件夾library來放我們引用的dll,建好的項目結構如下圖:
 
然后我們添加引用 using Newtonsoft.Json;下面我們來看看怎么使用吧!是不是此刻心情很激動啊~~呵呵,先來看看怎么讀取Json吧,我們自己寫一個Json字符串,來解析一下,這里給出幾種用法,大家根據自己愛好選擇。
上代碼,先來看第一種讀取Json的寫法,順序讀取:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;
using Newtonsoft.Json.Linq;

namespace JsonWithNewtonsoft
{
    class Program
    {
        static void Main(string[] args)
        {
            string jsonText = @"{""Name"" : ""Jack"", ""Age"" : ""22""}";
            JsonReader reader = new JsonTextReader(new StringReader(jsonText));

            while (reader.Read())
            {
                Console.WriteLine(reader.TokenType + "\t" + reader.ValueType + "\t" + reader.Value);
            }
            Console.Read();
        }
    }
}
 其輸出內容如下:
 
 
可以看到,他是順序解析Json,首先輸出Json開始標志StartObject,然后依次輸出Json的內容。
 
 下面來看第二種解析Json的方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;
using Newtonsoft.Json.Linq;

namespace JsonWithNewtonsoft
{
    class Program
    {
        static void Main(string[] args)
        {
            string jsonText = @"{""Name"" : ""Jack"", ""Age"" : ""22""}";

            JObject jo = JObject.Parse(jsonText);
            string[] values = jo.Properties().Select(item => item.Name.ToString() + ":" + item.Value.ToString()).ToArray();
            foreach(string s in values)
            {
                Console.WriteLine(s);
            }
            Console.Read();
        }
    }
}

這里使用JObject來解析Json數據,可以看到這里使用linq取出了Json的Name和Value屬性,然后將結果賦給values數組,輸出結果如下:

這就是解析Json的兩種方法,一種是使用StringReader,一種是使用JObject。

 

解析數組型數據

到這里Json解析就完了?當然沒完!這只是解析最基本的Json數據格式,下面來看下解析數組格式的Json數據,代碼如下:

            //數組型數據
            string jsonArrayText1 = "[{'Name':'Tom','Age':'16'},{'Name':'Mary','Age':'15'}]";
            JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText1);

            string name1 = ja[1]["Name"].ToString();
            Console.WriteLine(name1);
            //或者
            JObject o = (JObject)ja[1];
            string name2 = o["Name"].ToString();
            Console.WriteLine(name2);

這里我們定義了兩個學生,這里使用JArray這個類型,可以看到,他和數組的用法很像。當然還可以轉換成JObject類型,然后再進行取值操作。

 

解析嵌套性數據

還有一種Json格式,是嵌套格式,來看下如何解析吧。代碼如下:

           //嵌套格式
            jsonText = "{\"shanghai\":{\"zone\":\"浦東\",\"zone_en\":\"pudong\"}}";
            jo = (JObject)JsonConvert.DeserializeObject(jsonText);
            string zone = jo["shanghai"]["zone"].ToString();
            string zone_en = jo["shanghai"]["zone_en"].ToString();

代碼很簡單,我就不過多的解釋了。

到這里,讀取和解析Json的內容就講完了,下面我們來說一下序列化,就是生成Json的方法。

 

2、序列化Json

  先來看一下通用的生成Json的方法吧!就來輸出{"Name":"Jack","Age":"26"}代碼如下:

       //輸出{"Name":"Jack","Age":"26"}
            StringWriter sw = new StringWriter();
            JsonWriter writer = new JsonTextWriter(sw);
            writer.WriteStartObject();
            writer.WritePropertyName("Name");
            writer.WriteValue("Jack");
            writer.WritePropertyName("Age");
            writer.WriteValue("26");
            writer.WriteEndObject();
            writer.Flush();

            jsonText = sw.GetStringBuilder().ToString();
            Console.WriteLine(jsonText);

這段代碼運行后就是輸出{"Name":"Jack","Age":"26"},很簡單吧!

  下面來添加一個Student類,代碼如下,然后對其進行序列化,Student代碼:

 public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

下面來new一個Student,並進行序列化和反序列化,代碼如下:

            Student stu = new Student() { Name = "Jack", Age = 20 };
            JsonSerializer serializer = new JsonSerializer();
            sw = new StringWriter();
            serializer.Serialize(new JsonTextWriter(sw), stu);
            Console.WriteLine(sw.GetStringBuilder().ToString());

            StringReader sr = new StringReader(sw.GetStringBuilder().ToString());
            Student s = (Student)serializer.Deserialize(new JsonTextReader(sr), typeof(Student));
            Console.WriteLine(s.Name + "=>" + s.Age);

其輸出結果如下:

下面來序列化一個Student列表,看看得到什么,代碼如下:

        List<Student> students = new List<Student>();
            Student stu = new Student() { Name = "Jack", Age = 20 };
            Student stu1 = new Student() { Name = "Tom", Age = 21 };
            students.Add(stu);
            students.Add(stu1);
            JsonSerializer serializer = new JsonSerializer();
            sw = new StringWriter();
            serializer.Serialize(new JsonTextWriter(sw), students);
            Console.WriteLine(sw.GetStringBuilder().ToString());

運行結果如下:

看到這個,很熟悉吧,前面剛剛說過怎么解析這種格式的Json!當然,你們還有一種嵌套形式怎么生成呢?下面來修改Studnet類,添加電話號碼字段,修改后的Student類如下:

    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public List<string> Phones { get; set; }

    }

序列化代碼如下:

        List<Student> students = new List<Student>();
            Student stu = new Student() { Name = "Jack", Age = 20, Phones = new List<string> {"1455655888","15236988985" }};
            Student stu1 = new Student() { Name = "Tom", Age = 21, Phones = new List<string> { "1325889684", "15236988985" }};
            students.Add(stu);
            students.Add(stu1);
            JsonSerializer serializer = new JsonSerializer();
            sw = new StringWriter();
            serializer.Serialize(new JsonTextWriter(sw), students);

            Console.WriteLine(sw.GetStringBuilder().ToString());

輸出Json如下:

看到了吧,是不是前面說到的嵌套類型。解析方法前面也說過了。到這里,Newtonsoft.Json這個類庫的使用就講完了,當然他還有很多其他的功能等待着大家去發現。

 

如果大家趕緊這篇文章對你有用,請推薦一下或關注我,大家的支持是我最大的動力!

 

 作者:雲霏霏

 博客地址:http://www.cnblogs.com/yunfeifei/

 聲明:本博客原創文字只代表本人工作中在某一時間內總結的觀點或結論,與本人所在單位沒有直接利益關系。非商業,未授權,貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM