JSON 是存儲和交換文本信息的語法。類似 XML。
JSON 比 XML 更小、更快,更易解析。JSON跟XML一樣是一種是數據格式。
JSON 使用 JavaScript 語法來描述數據對象,但是 JSON 仍然獨立於語言和平台。JSON 解析器和 JSON 庫支持許多不同的編程語言。
JSON 語法規則
數據在鍵值對中 數據由逗號分隔 花括號保存對象 方括號保存數組
JSON 數據的書寫格式是:名稱/值對。 名稱/值對組合中的名稱寫在前面(在雙引號中),值對寫在后面(同樣在雙引號中),中間用冒號隔開:"firstName":"John"
JSON 值可以是: 數字(整數或浮點數) 字符串(在雙引號中) 邏輯值(true 或 false) 數組(在方括號中) 對象(在花括號中) null
JSON數據結構
json簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種復雜的結構
1、對象:對象在js中表示為“{}”括起來的內容,數據結構為 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為 對象.key (c# 對象[key])獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。
2、數組:數組在js中是中括號“[]”括起來的內容,數據結構為 ["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。
經過對象、數組2種結構就可以組合成復雜的數據結構了。
學習可以使用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();
}
}
}
輸出結果: