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安装,界面如下
c#学习—JSON文件及解析_第1张图片

四、利用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();
        }
    }
}

运行结果
c#学习—JSON文件及解析_第2张图片

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

运行结果
c#学习—JSON文件及解析_第3张图片
可以发现,结果是一样的,但是如此做会增加代码量,不够方便,下面介绍通过泛型去解析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();
        }
    }
}

运行结果:
c#学习—JSON文件及解析_第4张图片

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

运行结果:
c#学习—JSON文件及解析_第5张图片

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 = 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文档进行校验,确保书写正确
地址:https://www.bejson.com/
c#学习—JSON文件及解析_第6张图片

2.JSON数据生成c#实体类

当JSON设计多层时,可以使用工具,自动生成实体类模板
地址:https://www.bejson.com/convert/json2csharp/
c#学习—JSON文件及解析_第7张图片

你可能感兴趣的:(c#,json,c#,学习)