c#學習教程之JSON文件及解析實例

一、JSON文件介紹

JSON是存儲和交換文本的語法,類似於XML

但比XML更小,更容易解析,於XML一樣是一種數據格式

JSON是一種輕量級的數據交換格式,采用完全獨立於語言的文本格式,更容易編寫以及解析

例如

[
{"id":2,"name":"星河爆破","number":999},
{"id":3,"name":"九星連珠","number":9},
{"id":4,"name":"一語成讖","number":999}
]

二、JSO語法規則

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

三、引入JSON庫文件

JSON解析器和JSON庫支持許多不同的編程語言

能對json文件進行解析的有很多,詳見JSON官網,http://www.json.org/json-en.html

在主要是使用的是LitJSON或者Newtonsoft.Json,LitJSON使用NuGet安裝,界面如下

四、利用JSON.Mapper去解析JSON文件

4.1 JSON為數組

原始json內容

json.txt:

[
{"id":2,"name":"星河爆破","number":999},
{"id":3,"name":"九星連珠","number":9},
{"id":4,"name":"一語成讖","number":999}
]

思想:

1.利用File去讀取json文件
2.通過JsonMapper轉為對象(jsondata)
3.使用索引,遍歷jsondata進行輸出

代碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//引入LitJson
using LitJson;

namespace json操作
{
    class Program
    {
        static void Main(string[] args)
        {
            //JsonMapper類
            //ToObject方法可以將一個json字符串進行解析,
            //解析的結果是json.date
            //我們使用jsonMapper去解析json文本
            //jsondata代表一個數據或者對象
            //json217.txt為數組[],所以jsonData為數組
            //註意json文件位置,需要在bug目錄下
            JsonData jsonData =JsonMapper.ToObject(File.ReadAllText("json217.txt")) ;
            //使用foreach去遍歷數組信息
            //temp也是jsondata類型的,但是temp是一個對象
            foreach (JsonData temp in jsonData)
            {
                //通過索引其去取得temp中的value
                //返回值還是jsondata類型
                JsonData idvalue = temp["id"];
                JsonData namevalue = temp["name"];
                JsonData numbervalue = temp["number"];

                //將jsondata轉化為字符串進行輸出
                //name本身就為str,所以不用轉換
                int id = Int32.Parse(idvalue.ToString());
                int number = Int32.Parse(numbervalue.ToString());

                //輸出
                Console.WriteLine(id+":"+ namevalue + ":" + number);
            }


            Console.ReadKey();
        }
    }
}

運行結果

4.2 JSON為數組,使用實體類

原始json內容

json217.txt:

[
{"id":2,"name":"星河爆破","number":999},
{"id":3,"name":"九星連珠","number":9},
{"id":4,"name":"一語成讖","number":999}
]

思想:

1.根據JSON文件格式,建立實體類,例如根據json217.txt建立實體類Magic,包含id、name、number三個字段以及一個方法
2.根據json格式,新建list,使用Magic實體類作為泛型,新建magicList類
List<Magic> magicList = new List<Magic>();
3.通過JsonMapper轉為對象(jsondata),賦值到magicList中
4.對magicList進行遍歷輸出

新建一個Magic實體類用於解析

Magic.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace json操作
{
    class Magic
    {
        public int id;

        public string name;

        public int number;

        public override string ToString()
        {
            return string.Format("id:{0},name:{1},numebr:{2}",id,name,number);
        }
    }
}

代碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//引入LitJson
using LitJson;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace json操作
{
    class Program
    {
        static void Main(string[] args)
        {
            //因為json文件為集合,所以新建一個集合
            List<Magic> magicList = new List<Magic>();

            //依舊使用JsonMapper去進行解析
            JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json217.txt"));
            foreach (JsonData temp in jsonData)
            {
                //創建一個新對象
                Magic magic = new Magic();

                //通過索引其去取得temp中的value
                //返回值還是jsondata類型
                JsonData idvalue = temp["id"];
                JsonData namevalue = temp["name"];
                JsonData numbervalue = temp["number"];

                //將jsondata轉化為字符串進行輸出
                //name本身就為str,所以不用轉換
                int id = Int32.Parse(idvalue.ToString());
                int number = Int32.Parse(numbervalue.ToString());

                magic.id = id;
                magic.number = number;
                magic.name = namevalue.ToString();
                magicList.Add(magic);

            }
            foreach (var temp in magicList)     
            {
                Console.WriteLine(temp);
            }
            Console.ReadKey();
        }
    }
}

運行結果

可以發現,結果是一樣的,但是如此做會增加代碼量,不夠方便,下面介紹通過泛型去解析JSON

五、利用Json.MApper結合泛型去解析JSON文件

5.1JSON為數組

原始json內容

json217.txt:

[
{"id":2,"name":"星河爆破","number":999},
{"id":3,"name":"九星連珠","number":9},
{"id":4,"name":"一語成讖","number":999}
]

思想:

1.對JSON文件進行解析,發現為外層為數組格式,可以認為是一個Magic對象數組
2.使用泛型去解析,用<>表示泛型,如下一個Magic對象數組表示為Magic[]
JsonMapper.ToObject<Magic[]>
註意:json裡面的鍵必須與實體類對應
3.遍歷Magic[]

代碼:

namespace json操作
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用泛型去解析json
            //因為讀取的文件格式為magic實體類的數組,所以返回是個magic的數組
            //註意實體類需要對應上,
            Magic[] magicArray=JsonMapper.ToObject<Magic[]>(File.ReadAllText("json217.txt"));
            foreach(var temp in magicArray) 
            {
                Console.WriteLine(temp);
            }
            Console.Read();
        }
    }
}

運行結果:

5.2JSON為數組,使用集合去解析

思想:

1.對JSON文件進行解析,發現為外層為數組格式,也可以認為是個集合
2.使用泛型去解析,用<>表示泛型,如下一個Magic對象數組表示為Magic[]
JsonMapper.ToObject<Magic[]>改為JsonMapper.ToObject<List<Magic>>
註意:json裡面的鍵必須與實體類對應
3.遍歷List<Magic

代碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//引入LitJson
using LitJson;
namespace json操作
{
    class Program
    {
        static void Main(string[] args)
        {
            //任何可以數組的地方都可以使用一個集合
            List<Magic> magicklist = JsonMapper.ToObject<List<Magic>>(File.ReadAllText("json217.txt"));
            foreach (var temp in magicklist)
            {
                Console.WriteLine(temp);
            }
            Console.Read();
        }
    }
}

運行結果:

5.3JSON為對象

原始json內容

TextFlie.txt:

{
 "status": 1,
 "apiId": "89757",
 "date": "2022 / 01 / 24 13: 12: 10",
 "message": null,
 "devicelist": [{
				"productcode": "126345",
				"devicecode": "15632478",
				"url": "http://sssss/sssss/ssss/ssss"
				},
				{
				"productcode": "222222",
				"devicecode": "222222",
				"url": "http://sssss/sssss/ssss/ssss"
				},
				{
				"productcode": "333333",
				"devicecode": "333333",
				"url": "http://sssss/sssss/ssss/ssss"
				}
		]
}

思想:

1.對JSON文件進行解析,發現為整體為對象,對象中包括status、apiId、date、message、devicelist屬性
2.建立實體類模型,新建類IotDevice類,分為IotDevice類和DevicelistItem類
IotDevice類包含:status、apiId、date、message、devicelist(繼承與DevicelistItem)
DevicelistItem類包含:productcode、devicecode、url
有點像俄羅斯套娃的感覺
3.使用json.mapper<實體類>進行解析,返回值為實體類的對象
重點:建立實體類

IotDevice.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace json操作
{
    public class DevicelistItem
    {
        public string productcode { get; set; }
        public string devicecode { get; set; }
        public string url { get; set; }

        public override string ToString()
        {
            return string.Format("productcode:{0},devicecode:{1},url:{2}", productcode, devicecode, url);
        }
    }

    public class IotDevice
    {
        public int status { get; set; }
        public string apiId { get; set; }
        public string date { get; set; }
        public string message { get; set; }
        public List<DevicelistItem> devicelist { get; set; }
        public override string ToString()
        {
            return string.Format("status:{0},apiId:{1},date:{2},message:{3},devicelist:{4},", status, apiId, date, message, devicelist);
        }
    }
}

代碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//引入LitJson
using LitJson;
namespace _032json操作
{
    class Program
    {
        static void Main(string[] args)
        {
            //json文檔整體為IotDevice類型,所以轉換的時候泛型為<IotDevice>
            //返回值為IotDevice對象
            IotDevice iotdevice = JsonMapper.ToObject <IotDevice>(File.ReadAllText("TextFile1.txt"));
            Console.WriteLine(iotdevice);
            foreach (var temp in iotdevice.devicelist) 
            {
                Console.WriteLine(temp);
            }
            Console.Read();
        }
    }
}

運行結果:

5.4復雜的JSON文件解析

原始json內容

TextFlie2.txt:

在這裡插入代碼片

六、字符串轉化為JSON

代碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//引入LitJson
using LitJson;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace json操作
{
    class Program
    {
        static void Main(string[] args)
        {
            //新建IotDevice的實體類
            IotDevice device1 = new IotDevice();
            device1.date = "2022/02/17";
            device1.apiId = "89757";
            //轉為json的字符串
            string json = JsonMapper.ToJson(device1);
            Console.WriteLine(json);
            Console.Read();
        }
    }
}

運行結果:

七、JSON常用工具

1.JSON格式校驗工具

可以用來對寫的JSON文檔進行校驗,確保書寫正確

地址:http://tools.jb51.net/code/json

2.JSON數據生成c#實體類

當JSON設計多層時,可以使用工具,自動生成實體類模板

地址:http://tools.jb51.net/code/json2csharp

總結

到此這篇關於c#學習教程之JSON文件及解析的文章就介紹到這瞭,更多相關c# JSON文件解析內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: