JSON是存储和交换文本的语法,类似于XML
但比XML更小,更容易解析,于XML一样是一种数据格式
JSON是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,更容易编写以及解析
例如
[
{"id":2,"name":"星河爆破","number":999},
{"id":3,"name":"九星连珠","number":9},
{"id":4,"name":"一语成谶","number":999}
]
数据保存在键值对中
数据由逗号分割
花括号保存对象
方括号保存数组
JSON解析器和JSON库支持许多不同的编程语言
能对json文件进行解析的有很多,详见JSON官网,http://www.json.org/json-en.html
在主要是使用的是LitJSON或者Newtonsoft.Json,LitJSON使用NuGet安装,界面如下
原始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();
}
}
}
原始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内容
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();
}
}
}
思想:
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();
}
}
}
原始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 = JsonMapper.ToObject <IotDevice>(File.ReadAllText("TextFile1.txt"));
Console.WriteLine(iotdevice);
foreach (var temp in iotdevice.devicelist)
{
Console.WriteLine(temp);
}
Console.Read();
}
}
}
原始json内容
TextFlie2.txt:
在这里插入代码片
代码:
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文档进行校验,确保书写正确
地址:https://www.bejson.com/
当JSON设计多层时,可以使用工具,自动生成实体类模板
地址:https://www.bejson.com/convert/json2csharp/