c#學(xué)習(xí)教程之JSON文件及解析實(shí)例
一、JSON文件介紹
JSON是存儲(chǔ)和交換文本的語法,類似于XML
但比XML更小,更容易解析,于XML一樣是一種數(shù)據(jù)格式
JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,采用完全獨(dú)立于語言的文本格式,更容易編寫以及解析
例如
[
{"id":2,"name":"星河爆破","number":999},
{"id":3,"name":"九星連珠","number":9},
{"id":4,"name":"一語成讖","number":999}
]
二、JSO語法規(guī)則
- 數(shù)據(jù)保存在鍵值對(duì)中
- 數(shù)據(jù)由逗號(hào)分割
- 花括號(hào)保存對(duì)象
- 方括號(hào)保存數(shù)組
三、引入JSON庫文件
JSON解析器和JSON庫支持許多不同的編程語言
能對(duì)json文件進(jìn)行解析的有很多,詳見JSON官網(wǎng),http://www.json.org/json-en.html
在主要是使用的是LitJSON或者Newtonsoft.Json,LitJSON使用NuGet安裝,界面如下

四、利用JSON.Mapper去解析JSON文件
4.1 JSON為數(shù)組
原始json內(nèi)容
json.txt:
[
{"id":2,"name":"星河爆破","number":999},
{"id":3,"name":"九星連珠","number":9},
{"id":4,"name":"一語成讖","number":999}
]
思想:
1.利用File去讀取json文件
2.通過JsonMapper轉(zhuǎn)為對(duì)象(jsondata)
3.使用索引,遍歷jsondata進(jìn)行輸出
代碼:
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方法可以將一個(gè)json字符串進(jìn)行解析,
//解析的結(jié)果是json.date
//我們使用jsonMapper去解析json文本
//jsondata代表一個(gè)數(shù)據(jù)或者對(duì)象
//json217.txt為數(shù)組[],所以jsonData為數(shù)組
//注意json文件位置,需要在bug目錄下
JsonData jsonData =JsonMapper.ToObject(File.ReadAllText("json217.txt")) ;
//使用foreach去遍歷數(shù)組信息
//temp也是jsondata類型的,但是temp是一個(gè)對(duì)象
foreach (JsonData temp in jsonData)
{
//通過索引其去取得temp中的value
//返回值還是jsondata類型
JsonData idvalue = temp["id"];
JsonData namevalue = temp["name"];
JsonData numbervalue = temp["number"];
//將jsondata轉(zhuǎn)化為字符串進(jìn)行輸出
//name本身就為str,所以不用轉(zhuǎn)換
int id = Int32.Parse(idvalue.ToString());
int number = Int32.Parse(numbervalue.ToString());
//輸出
Console.WriteLine(id+":"+ namevalue + ":" + number);
}
Console.ReadKey();
}
}
}
運(yùn)行結(jié)果:

4.2 JSON為數(shù)組,使用實(shí)體類
原始json內(nèi)容
json217.txt:
[
{"id":2,"name":"星河爆破","number":999},
{"id":3,"name":"九星連珠","number":9},
{"id":4,"name":"一語成讖","number":999}
]
思想:
1.根據(jù)JSON文件格式,建立實(shí)體類,例如根據(jù)json217.txt建立實(shí)體類Magic,包含id、name、number三個(gè)字段以及一個(gè)方法
2.根據(jù)json格式,新建list,使用Magic實(shí)體類作為泛型,新建magicList類
List<Magic> magicList = new List<Magic>();
3.通過JsonMapper轉(zhuǎn)為對(duì)象(jsondata),賦值到magicList中
4.對(duì)magicList進(jìn)行遍歷輸出
新建一個(gè)Magic實(shí)體類用于解析
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)
{
//因?yàn)閖son文件為集合,所以新建一個(gè)集合
List<Magic> magicList = new List<Magic>();
//依舊使用JsonMapper去進(jìn)行解析
JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json217.txt"));
foreach (JsonData temp in jsonData)
{
//創(chuàng)建一個(gè)新對(duì)象
Magic magic = new Magic();
//通過索引其去取得temp中的value
//返回值還是jsondata類型
JsonData idvalue = temp["id"];
JsonData namevalue = temp["name"];
JsonData numbervalue = temp["number"];
//將jsondata轉(zhuǎn)化為字符串進(jìn)行輸出
//name本身就為str,所以不用轉(zhuǎn)換
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();
}
}
}
運(yùn)行結(jié)果:

可以發(fā)現(xiàn),結(jié)果是一樣的,但是如此做會(huì)增加代碼量,不夠方便,下面介紹通過泛型去解析JSON
五、利用Json.MApper結(jié)合泛型去解析JSON文件
5.1JSON為數(shù)組
原始json內(nèi)容
json217.txt:
[
{"id":2,"name":"星河爆破","number":999},
{"id":3,"name":"九星連珠","number":9},
{"id":4,"name":"一語成讖","number":999}
]
思想:
1.對(duì)JSON文件進(jìn)行解析,發(fā)現(xiàn)為外層為數(shù)組格式,可以認(rèn)為是一個(gè)Magic對(duì)象數(shù)組
2.使用泛型去解析,用<>表示泛型,如下一個(gè)Magic對(duì)象數(shù)組表示為Magic[]
JsonMapper.ToObject<Magic[]>
注意:json里面的鍵必須與實(shí)體類對(duì)應(yīng)
3.遍歷Magic[]
代碼:
namespace json操作
{
class Program
{
static void Main(string[] args)
{
//使用泛型去解析json
//因?yàn)樽x取的文件格式為magic實(shí)體類的數(shù)組,所以返回是個(gè)magic的數(shù)組
//注意實(shí)體類需要對(duì)應(yīng)上,
Magic[] magicArray=JsonMapper.ToObject<Magic[]>(File.ReadAllText("json217.txt"));
foreach(var temp in magicArray)
{
Console.WriteLine(temp);
}
Console.Read();
}
}
}
運(yùn)行結(jié)果:

5.2JSON為數(shù)組,使用集合去解析
思想:
1.對(duì)JSON文件進(jìn)行解析,發(fā)現(xiàn)為外層為數(shù)組格式,也可以認(rèn)為是個(gè)集合
2.使用泛型去解析,用<>表示泛型,如下一個(gè)Magic對(duì)象數(shù)組表示為Magic[]
JsonMapper.ToObject<Magic[]>改為JsonMapper.ToObject<List<Magic>>
注意:json里面的鍵必須與實(shí)體類對(duì)應(yīng)
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)
{
//任何可以數(shù)組的地方都可以使用一個(gè)集合
List<Magic> magicklist = JsonMapper.ToObject<List<Magic>>(File.ReadAllText("json217.txt"));
foreach (var temp in magicklist)
{
Console.WriteLine(temp);
}
Console.Read();
}
}
}
運(yùn)行結(jié)果:

5.3JSON為對(duì)象
原始json內(nèi)容
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.對(duì)JSON文件進(jìn)行解析,發(fā)現(xiàn)為整體為對(duì)象,對(duì)象中包括status、apiId、date、message、devicelist屬性
2.建立實(shí)體類模型,新建類IotDevice類,分為IotDevice類和DevicelistItem類
IotDevice類包含:status、apiId、date、message、devicelist(繼承與DevicelistItem)
DevicelistItem類包含:productcode、devicecode、url
有點(diǎn)像俄羅斯套娃的感覺
3.使用json.mapper<實(shí)體類>進(jìn)行解析,返回值為實(shí)體類的對(duì)象
重點(diǎn):建立實(shí)體類
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類型,所以轉(zhuǎn)換的時(shí)候泛型為<IotDevice>
//返回值為IotDevice對(duì)象
IotDevice iotdevice = JsonMapper.ToObject <IotDevice>(File.ReadAllText("TextFile1.txt"));
Console.WriteLine(iotdevice);
foreach (var temp in iotdevice.devicelist)
{
Console.WriteLine(temp);
}
Console.Read();
}
}
}
運(yùn)行結(jié)果:


5.4復(fù)雜的JSON文件解析
原始json內(nèi)容
TextFlie2.txt:
在這里插入代碼片
六、字符串轉(zhuǎn)化為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的實(shí)體類
IotDevice device1 = new IotDevice();
device1.date = "2022/02/17";
device1.apiId = "89757";
//轉(zhuǎn)為json的字符串
string json = JsonMapper.ToJson(device1);
Console.WriteLine(json);
Console.Read();
}
}
}
運(yùn)行結(jié)果:

七、JSON常用工具
1.JSON格式校驗(yàn)工具
可以用來對(duì)寫的JSON文檔進(jìn)行校驗(yàn),確保書寫正確
地址:http://tools.jb51.net/code/json
2.JSON數(shù)據(jù)生成c#實(shí)體類
當(dāng)JSON設(shè)計(jì)多層時(shí),可以使用工具,自動(dòng)生成實(shí)體類模板
地址:http://tools.jb51.net/code/json2csharp
總結(jié)
到此這篇關(guān)于c#學(xué)習(xí)教程之JSON文件及解析的文章就介紹到這了,更多相關(guān)c# JSON文件解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c# for循環(huán)中創(chuàng)建線程執(zhí)行問題
這篇文章主要介紹了有關(guān)c# for循環(huán)中創(chuàng)建線程執(zhí)行問題,下面文章將將以舉例的方式展開for循環(huán)中創(chuàng)建線程執(zhí)行問題的內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助2021-11-11
C#使用InstallerProjects打包桌面應(yīng)用程序的完整步驟
這篇文章主要給大家介紹了關(guān)于C#使用InstallerProjects打包桌面應(yīng)用程序的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
詳解C# Socket簡(jiǎn)單例子(服務(wù)器與客戶端通信)
這篇文章主要介紹了詳解C# Socket簡(jiǎn)單例子(服務(wù)器與客戶端通信) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12
ASP.NET總結(jié)C#中7種獲取當(dāng)前路徑的方法
本文主要介紹了7種獲取當(dāng)前路徑的方法,并做了代碼演示,分享給大家,感興趣的朋友可以參考一下。2016-03-03
insert語句太長(zhǎng)用StringBuilder優(yōu)化一下
insert語句太長(zhǎng)用StringBuilder優(yōu)化一下,下面是示例代碼,需要的朋友可以研究研究2014-07-07
C#向線程中傳遞多個(gè)參數(shù)的解決方法(兩種)
這篇文章主要介紹了C#向線程中傳遞多個(gè)參數(shù)的解決方法(兩種)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07

