JSON(全稱爲JavaScript Object Notation) 是一種輕量級的數據交換格式。它是基於JavaScript語法標準的一個子集。 JSON採用徹底獨立於語言的文本格式,能夠很容易在各類網絡、平臺和程序之間傳輸。JSON的語法很簡單,易於人閱讀和編寫,同時也易於機器解析和生成。
json
JSON與XML的比較
◆ 可讀性
JSON和XML的可讀性相比較而言,因爲XML提供輔助的標籤,更加適合人閱讀和理解。
◆ 文件大小與傳輸
XML容許使用方便的標籤,因此文件尺寸是要比JSON大的。並且JSON源於Javascript,因此天生的主戰場是Javascript與網絡,在這裏,JSON有着XML沒法趕超的優點。
JSON語法
一、 JSON 語法是 JavaScript 對象表示法語法的子集。
• 數據在名稱/值對中:名稱是字符串,使用雙引號表示。值能夠是:數字(整數或浮點數),字符串(在雙引號中),數組(在方括號中),對象(在花括號中),
true
/
false
/
null
。
• 數據由逗號分隔:
• 花括號保存對象:對象能夠包含各類數據,包括數組。
• 方括號保存數組:數字能夠包含對象。
例如:
{
"student"
: [
{
"firstName"
:
"Bill"
,
"lastName"
:
"Gates"
},
{
"grade"
:
"3"
,
"sex"
:
"boy"
}
]
}
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(); } } }
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數據,代碼以下:ui
//數組型數據 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類型,而後再進行取值操做。spa
解析嵌套性數據code
還有一種Json格式,是嵌套格式,來看下如何解析吧。代碼以下:xml
//嵌套格式 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的方法。blog
二、序列化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/
聲明:本博客原創文字只表明本人工做中在某一時間內總結的觀點或結論,與本人所在單位沒有直接利益關係。非商業,未受權,貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。