C#編程 JSON操做

JSON 是存儲和交換文本信息的語法。相似 XML。javascript

JSON 比 XML 更小、更快,更易解析。JSON跟XML同樣是一種是數據格式。java

JSON 使用 JavaScript 語法來描述數據對象,可是 JSON 仍然獨立於語言和平臺。JSON 解析器和 JSON 庫支持許多不一樣的編程語言。編程

 

JSON 語法規則

數據在鍵值對中     數據由逗號分隔     花括號保存對象     方括號保存數組json

JSON 數據的書寫格式是:名稱/值對。 名稱/值對組合中的名稱寫在前面(在雙引號中),值對寫在後面(一樣在雙引號中),中間用冒號隔開:"firstName":"John"c#

JSON 值能夠是: 數字(整數或浮點數) 字符串(在雙引號中) 邏輯值(true 或 false) 數組(在方括號中) 對象(在花括號中) null數組

 

JSON數據結構

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();
        }
    }
}

輸出結果:

相關文章
相關標籤/搜索