C#編程 JSON操作


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

輸出結果:

 


免責聲明!

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



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