c# JSON文件解析
变瘦的鹏少 人气:0一、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.softyun.net/code/json
2.JSON数据生成c#实体类
当JSON设计多层时,可以使用工具,自动生成实体类模板
地址:http://tools.softyun.net/code/json2csharp
总结
加载全部内容