JSON 是存儲和交換文本信息的語法。相似 XML。javascript
JSON 比 XML 更小、更快,更易解析。JSON跟XML同樣是一種是數據格式。java
JSON 使用 JavaScript 語法來描述數據對象,可是 JSON 仍然獨立於語言和平臺。JSON 解析器和 JSON 庫支持許多不一樣的編程語言。編程
數據在鍵值對中 數據由逗號分隔 花括號保存對象 方括號保存數組json
JSON 數據的書寫格式是:名稱/值對。 名稱/值對組合中的名稱寫在前面(在雙引號中),值對寫在後面(一樣在雙引號中),中間用冒號隔開:"firstName":"John"c#
JSON 值能夠是: 數字(整數或浮點數) 字符串(在雙引號中) 邏輯值(true 或 false) 數組(在方括號中) 對象(在花括號中) null數組
json簡單說就是javascript中的對象和數組,因此這兩種結構就是對象和數組兩種結構,經過這兩種結構能夠表示各類複雜的結構數據結構
一、對象:對象在js中表示爲「{}」括起來的內容,數據結構爲 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key爲對象的屬性,value爲對應的屬性值,因此很容易理解,取值方法爲 對象.key (c# 對象[key])獲取屬性值,這個屬性值的類型能夠是 數字、字符串、數組、對象幾種。app
二、數組:數組在js中是中括號「[]」括起來的內容,數據結構爲 ["java","javascript","vb",...],取值方式和全部語言中同樣,使用索引獲取,字段值的類型能夠是 數字、字符串、數組、對象幾種。編程語言
通過對象、數組2種結構就能夠組合成複雜的數據結構了。ide
學習可使用json的官網:http://www.json.org/
在前面咱們解析XML文本的時候,使用的是自帶的XmlDocument,在這裏解析json文本的時候,須要咱們本身下載所需的庫文件。在官網中,C#下解析的方式不少,咱們通常選用Litjson。有兩種引用litjson的方法:
(1)去litjson的網站下載litjson.dll 而後添加引用 找到dll所在目錄
(2)右鍵項目的引用,選擇NuGet程序包,在聯機中搜索litjson安裝
下面咱們解析一段json格式的文本,這個文本表示的是一個數組
[ {"id":2,"name":"天下無雙","damage":123 }, {"id":3,"name":"天下無賊","damage":21 }, {"id":4,"name":"咫尺天涯","damage":900 } ]
首先定義一個Skill類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _032_json操做 { class Skill { public int id; public int damage; public string name; public override string ToString() { return string.Format("Id: {0}, Damage: {1}, Name: {2}", id, damage, name); } } }
解析:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using LitJson; namespace _032_json操做 { class Program { static void Main(string[] args) { List<Skill> skillList = new List<Skill>(); //咱們使用jsonMapper去解析json文本 //jsondata表明一個數組或者一個對象 //在這裏jsonData表明數組 JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json技能信息.txt")); foreach (JsonData temp in jsonData)//在這裏temp表明一個對象 { Skill skill = new Skill(); JsonData idValue = temp["id"]; //經過字符串索引器能夠取得鍵值對的值 JsonData nameValue = temp["name"]; JsonData damageValue = temp["damage"]; int id = Int32.Parse(idValue.ToString()); int damage = Int32.Parse(damageValue.ToString()); //Console.WriteLine(id+":"+nameValue.ToString()+":"+damage); skill.id = id; skill.damage = damage; skill.name = nameValue.ToString(); skillList.Add(skill); } foreach (var temp in skillList) { Console.WriteLine(temp); } Console.ReadKey(); } } }
輸出結果:
除了上面的方法,更簡單是使用泛型來解析,可是json裏面對象的鍵必須和定義的類裏面的字段或者屬性保持一致
Skill[] skillArray = JsonMapper.ToObject<Skill[]>(File.ReadAllText("json技能信息.txt")); foreach (var temp in skillArray) { Console.WriteLine(temp); }
或者寫成
List<Skill> skillList = JsonMapper.ToObject<List<Skill>>(File.ReadAllText("json技能信息.txt")); foreach (var temp in skillList) { Console.WriteLine(temp); }
上面解析的是一個數組,下面咱們解析一個對象:
{ "Name":"siki", "Level":99, "Age":18, "SkillList":[ {"id":2,"name":"天下無雙","damage":123 }, {"id":3,"name":"天下無賊","damage":21 }, {"id":4,"name":"咫尺天涯","damage":900 } ] }
定義類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _032_json操做 { class Player { public string Name { get; set; } public int Level { get; set; } public int Age { get; set; } public List<Skill> SkillList { get; set; } public override string ToString() { return string.Format("Name: {0}, Level: {1}, Age: {2}, SkillList: {3}", Name, Level, Age, SkillList); } } }
解析:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using LitJson; namespace _032_json操做 { class Program { static void Main(string[] args) { Player p = JsonMapper.ToObject<Player>(File.ReadAllText("主角信息.txt")); Console.WriteLine(p); foreach (var temp in p.SkillList) { Console.WriteLine(temp); } Console.ReadKey(); } } }
輸出結果:
咱們進行數據傳遞的時候,將數據作成json格式以便傳輸
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using LitJson; namespace _032_json操做 { class Program { static void Main(string[] args) { Player p = new Player(); p.Name = "花千骨"; p.Level = 100; p.Age = 16; string json = JsonMapper.ToJson(p); Console.WriteLine(json); Console.ReadKey(); } } }
輸出結果: