小言_互联网的博客

C#解析JSON文件和XML文件(2021.05.26)

392人阅读  评论(0)

前提环境(VS2015已安装C#)

1、JSON文件和XML文件简介

1.1 JSON文件

        JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式,它采用完全独立于编程语言的文本格式来存储和表示数据,由于层次结构简洁清晰、易于阅读和编写、易于机器解析和生成,能够有效提升网络数据的传输效率。
        JSON是一个标记符的序列,其中标记符包含六个构造字符(左大括号{ 、左中括号[ 、右中括号] 、右大括号}、冒号: 、逗号, ),任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等,但对象和数组是比较特殊且较为常用。
        字符串与C或者Java的字符串非常相似。字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
        数字也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
        对象:对象在 JavaScript 中由花括号 {}括起来逗号分割的成员构成,数据结构为 {key1:value1, key2:value2, ...}的键值对结构,在面向对象的语言中,key 为对象的属性,value 为对应的值,其中键名可以使用整数和字符串来表示,值的类型可以是任意类型。
        数组:数组在 JavaScript 中是由方括号 [] 括起来的一组值构成,数据结构为["java", "javascript", "vb", ...]的索引结构,值的类型也可以是任意类型。
        用JSON表示中国部分省市如下:

{
   
    "name": "中国",
    "province": [{
   
        "name": "黑龙江",
        "cities": {
   
            "city": ["哈尔滨", "大庆"]
        }
    }, {
   
        "name": "广东",
        "cities": {
   
            "city": ["广州", "深圳", "珠海"]
        }
    }, {
   
        "name": "台湾",
        "cities": {
   
            "city": ["台北", "高雄"]
        }
    }, {
   
        "name": "新疆",
        "cities": {
   
            "city": ["乌鲁木齐"]
        }
    }]
}

1.2 XML文件

        可扩展标记语言是标准通用标记语言的子集,简称XML,它是一种用于标记电子文件使其具有结构性的标记语言。XML的简单易于在任何应用程序中读/写数据,这使XML很快成为数据交换的唯一公共语言。XML具有以下特点:(1) XML可以从HTML中分离数据;(2) XML可用于交换数据;(3)利用XML可以共享数据;(4) XML可以充分利用数据;(5) XML可以用于创建新的语言。XML使用一个简单而又灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。HTML着重描述如何将文件显示在浏览器中,而XML则着重描述如何将数据以结构化方式表示
        XML文件格式是纯文本格式,它由XML元素组成,每个XML元素包括一个开始标记,一个结束标记以及两个标记之间的内容。标记是对文档存储格式和逻辑结构的描述。在形式上,标记中可能包括注释、引用、字符数据段、起始标记、结束标记、空元素、文档类型声明( DTD)和序言。具体规则如下:1、必须有声明语句<?xml version="1.0" encoding="utf-8"?>;2、区分大小写;3、XML文档有且只有一个根元素;4、属性值使用引号;5、所有的标记必须有相应的结束标记;6、所有的空标记也必须被关闭。
        用XML表示中国部分省市如下:

<?xml version="1.0" encoding="utf-8"?>
<country>
    <name>中国</name>
    <province>
        <name>黑龙江</name>
        <cities>
            <city>哈尔滨</city>
            <city>大庆</city>
        </cities>
    </province>
    <province>
        <name>广东</name>
        <cities>
            <city>广州</city>
            <city>深圳</city>
            <city>珠海</city>
        </cities>
    </province>
    <province>
        <name>台湾</name>
        <cities>
            <city>台北</city>
            <city>高雄</city>
        </cities>
    </province>
    <province>
        <name>新疆</name>
        <cities>
            <city>乌鲁木齐</city>
        </cities>
    </province>
</country>

2、C# 解析两种类型的JSON文件

        JSON文件被读取到内存中后就变成了字符串,而.NET操作JSON即生成与解析JSON字符串。当前,C#操作JSON的方式主要有两种:一、按照JSON字符串解析;二、使用开源类库Newtonsoft.Json,下载后添加dll引用即可直接调用。这里使用后者进行JSON文件的解析。

        Newtonsoft.Json,是.Net中开源的Json序列化和反序列化工具,官方下载dll地址,功能比较多,效率比较高。比较常用的功能除了序列化发序列化之外,还有 Linq To Json、Json Path、 XML support等。下载Json130r1.zip后进行解压,在Json130r1\Bin\net45文件夹下可以找到Newtonsoft.Json.dll动态链接库文件。

        C#解析JSON文件时添加引用浏览到Newtonsoft.Json.dll文件,并且需要在C#代码中引入以下库:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

2.1 单个json格式对应文件的C#解析

2.1.1 单个json格式对应文件

        下面的mark_20210517_141354.json文件包含type、time、user、img和data四个键,其中data下又包含userId、id、markId、name(值以unicode编码)、address、temperature、dampness、type、latgitude、longitude、ampLat、ampLng、userName(值以unicode编码)、createDate、describe(值以unicode编码)和signId

        mark_20210517_141354.json文件内容如下:

{
   
    "type": "mark",
    "time": "2021-05-17 14:13:54",
    "user": "17888830651",
    "img": [
        "JPEG_20210517_141333.jpg"
    ],
    "data": {
   
        "userId": "17888830651",
        "id": "4",
        "markId": "4",
        "name": "\u6d4b\u8bd501",
        "address": "",
        "temperature": "35",
        "dampness": "31",
        "type": "\u5d29\u584c",
        "latgitude": "3028.23286",
        "longitude": "11431.60309",
        "ampLat": "30.46797829546509",
        "ampLng": "114.5319019906904",
        "userName": "\u8f9b\u6d69\u6d69",
        "createDate": "1621232032592",
        "describe": "\u6b63\u5f0f\u6d4b\u8bd5\u8d77\u70b9",
        "signId": "20210517_141354"
    }
}

2.1.2 C#解析代码

        第一步,打开Visual Studio 2015,新建C#->控制台应用程序,项目名称输入CSharpParseJSON1后点击确定

        第二步,在右侧解决方案资源管理器下的CSharpParseJSON1项目上右键选择添加->引用

        在弹出的引用管理器窗口中点击左侧浏览后会弹出选择要引用的文件窗口,选择Newtonsoft.Json.dll文件后确定即可,同时在右侧的解决方案资源管理器下CSharpParseJSON1项目下的引用中可以看到Newtonsoft.Json



        第三步,将mark_20210517_141354.json文件放到D:\搜狗高速下载目录下
        第四步,在Program.cs对应的完整代码如下,对照着复制到主函数中即可运行。
Program.cs

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

namespace CSharpParseJSON1
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            String filepath= "D:\\搜狗高速下载\\mark_20210517_141354.json";
            if (File.Exists(filepath))//存在
            {
   
                FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
                StreamReader file = new StreamReader(fs, System.Text.Encoding.Default);
                JsonTextReader reader = new JsonTextReader(file);//解析json模块
                JObject o = (JObject)JToken.ReadFrom(reader);
                string type1 = o["type"].ToString();
                string time = o["time"].ToString();
                string user = o["user"].ToString();
                string[] img = o["img"].ToString().Split('"');
                string userId = o["data"]["userId"].ToString();
                string id = o["data"]["id"].ToString();
                string markId = o["data"]["markId"].ToString();
                string name = o["data"]["name"].ToString();
                string address = o["data"]["address"].ToString();
                string temperature = o["data"]["temperature"].ToString();
                string dampness = o["data"]["dampness"].ToString();
                string type2 = o["data"]["type"].ToString();
                string ampLat = o["data"]["ampLat"].ToString();
                string ampLng = o["data"]["ampLng"].ToString();
                string userName = o["data"]["userName"].ToString();
                string createDate = o["data"]["createDate"].ToString();
                string describe = o["data"]["describe"].ToString();
                string signId = o["data"]["signId"].ToString();
                reader.Close();
                file.Close();
                fs.Close();
                string info = "type:" + type1 + "\n"
                             + "time:" + time + "\n"
                             + "user:" + user + "\n"
                             + "img:" + img[1] + "\n"
                             + "data:" + "\n"
                             + "    userId:" + userId + "\n"
                             + "    id:" + id + "\n"
                             + "    markId:" + markId + "\n"
                             + "    name:" + name + "\n"
                             + "    address:" + address + "\n"
                             + "    temperature:" + temperature + "\n"
                             + "    dampness:" + dampness + "\n"
                             + "    type:" + type2 + "\n"
                             + "    ampLat:" + ampLat + "\n"
                             + "    ampLng:" + ampLng + "\n"
                             + "    userName:" + userName + "\n"
                             + "    createDate:" + createDate + "\n"
                             + "    describe:" + describe + "\n"
                             + "    signId:" + signId + "\n";
                Console.WriteLine(filepath+"解析结果如下:");
                Console.Write(info);
                string result1 = "D:\\搜狗高速下载\\result1.txt";//文本文件模块
                FileStream writetxt_fs = new FileStream(result1, FileMode.Create);
                StreamWriter wr = new StreamWriter(writetxt_fs, System.Text.Encoding.Default);
                wr.WriteLine(info);
                wr.Close();
                writetxt_fs.Close();
                Console.WriteLine("解析结果已保存到:"+result1);
            }
        }
    }
}


        第五步,运行结果如下图所示,控制台输出了解析后的结果,同时解析结果也被保存到了result1.txt中。

2.2 一个json格式为一行的JSON文件的C#解析

2.2.1 一个json格式为一行的JSON文件

        下面的coords.json文件中每一行是一个json格式的字符串,每一行json字符串包含gpsLatLng、latLng、phone、userName 和 time五个键,其中gpsLatLng又包含lat 和 lng两个键,latLng又包含latitude 和 longitude两个键。

        coords.json文件内容如下:

{
   "gpsLatLng": {
   "lat": 4000.04239, "lng": 11619.54174}, "latLng": {
   "latitude": 40.00200936705921, "longitude": 116.33184418780239}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:02.752"}
{
   "gpsLatLng": {
   "lat": 4000.04237, "lng": 11619.54266}, "latLng": {
   "latitude": 40.00200909635228, "longitude": 116.33185952246586}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:04.852"}
{
   "gpsLatLng": {
   "lat": 4000.04228, "lng": 11619.54301}, "latLng": {
   "latitude": 40.002007607397815, "longitude": 116.33186533544026}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:05.811"}
{
   "gpsLatLng": {
   "lat": 4000.0423, "lng": 11619.54327}, "latLng": {
   "latitude": 40.00200791583858, "longitude": 116.33186974545544}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:06.807"}
{
   "gpsLatLng": {
   "lat": 4000.0424, "lng": 11619.54389}, "latLng": {
   "latitude": 40.00200963564034, "longitude": 116.33188006902002}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:09.848"}
{
   "gpsLatLng": {
   "lat": 4000.04247, "lng": 11619.54417}, "latLng": {
   "latitude": 40.00201074468999, "longitude": 116.3318847798118}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:14.913"}
{
   "gpsLatLng": {
   "lat": 4000.04255, "lng": 11619.54401}, "latLng": {
   "latitude": 40.002012139577936, "longitude": 116.33188207385594}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:16.900"}
{
   "gpsLatLng": {
   "lat": 4000.04264, "lng": 11619.54389}, "latLng": {
   "latitude": 40.00201363581099, "longitude": 116.33188006949972}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:17.902"}
{
   "gpsLatLng": {
   "lat": 4000.04273, "lng": 11619.54376}, "latLng": {
   "latitude": 40.00201513166096, "longitude": 116.33187786468991}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:19.120"}
{
   "gpsLatLng": {
   "lat": 4000.04282, "lng": 11619.54364}, "latLng": {
   "latitude": 40.00201662789402, "longitude": 116.33187586033372}, "phone": "17888830651", "userName": "eric", "time": "2021-01-12 22:25:19.930"}

2.2.2 C#解析代码

        第一步,打开Visual Studio 2015,新建C#->控制台应用程序,项目名称输入CSharpParseJSON2后点击确定

        第二步,在右侧解决方案资源管理器下的CSharpParseJSON2项目上右键选择添加->引用

        在弹出的引用管理器窗口中点击左侧浏览后会弹出选择要引用的文件窗口,选择Newtonsoft.Json.dll文件后确定即可,同时在右侧的解决方案资源管理器下CSharpParseJSON2项目下的引用中可以看到Newtonsoft.Json


        第三步,将coords.json文件放到D:\搜狗高速下载目录下

        第四步,在Program.cs对应的完整代码如下,对照着复制到主函数中即可运行。

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

namespace CSharpParseJSON2
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            string filepath = @"D:\搜狗高速下载\coords.json";
            if (File.Exists(filepath))//存在
            {
   
                FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
                StreamReader file = new StreamReader(fs, System.Text.Encoding.Default);
                string linetxt = null;
                double latitude = 0, longitude = 0;
                string result1 = @"D:\搜狗高速下载\coordslatlon.txt";//文本文件模块
                FileStream writetxt_fs = new FileStream(result1, FileMode.Create);
                StreamWriter wr = new StreamWriter(writetxt_fs, System.Text.Encoding.Default);
                while ((linetxt = file.ReadLine()) != null)
                {
   
                    JObject jo = (JObject)JsonConvert.DeserializeObject(linetxt);                                  
                    string Lat = jo["gpsLatLng"]["lat"].ToString();
                    string Lng = jo["gpsLatLng"]["lng"].ToString();
                    double gpslat = double.Parse(Lat);
                    double gpslon = double.Parse(Lng);
                    gpslat = gpslat / 100.0 - (gpslat % 100.0) / 100.0 + (gpslat % 100.0) / 60.0;
                    gpslon = gpslon / 100.0 - (gpslon % 100.0) / 100.0 + (gpslon % 100.0) / 60.0;
                    string latLng_lat = jo["latLng"]["latitude"].ToString();
                    string latLng_lon = jo["latLng"]["longitude"].ToString();
                    string phone = jo["phone"].ToString();
                    string userName = jo["userName"].ToString();
                    string time = jo["time"].ToString();
                    string lineparsetxt = "GPS纬度:" + gpslat + "GPS经度:" + gpslon + "普通纬度:" + latLng_lat + "普通经度:" + latLng_lon 
                                          + "电话:" + phone + "用户名:" + userName + "时刻:" + time;
                    Console.WriteLine(lineparsetxt);
                    wr.WriteLine(lineparsetxt);                   
                }
                file.Close();
                fs.Close();
                wr.Close();
                writetxt_fs.Close();
            }
        }
    }
}


        第五步,运行结果如下图所示,控制台输出了解析后的结果,同时解析结果也被保存到了coordslatlon.txt中。

3、C# 解析XML文件

        C#解析XML文件可以直接引用C#自带的XML解析库:using System.Xml;
        第一步,打开Visual Studio 2015,新建一个C#控制台窗口应用程序,项目名称输入CSharpParseXML后点击确定

        第二步,在右侧解决方案资源管理器下CSharpParseXML项目上右键选择添加->新建项

        在添加新项窗口中选择XML文件,输入process.xml为文件名后点击确定

        然后在process.xml文件中输入以下内容,可以看到process节点下有多个action,每个action都有Type和Belongto这两个属性、actionid、name、ability和wait这四个目录

<?xml version="1.0" encoding="utf-8" ?>
<process>
  <action Type="Move" Belongto="Bed">
    <actionid>1</actionid>
    <name>GetUp</name>
    <ability>早上起床</ability>
    <wait>3</wait>
  </action>
  <action Type="Eat" Belongto="Brfast">
    <actionid>2</actionid>
    <name>EatBrfast</name>
    <ability>吃早饭</ability>
    <wait>5</wait>
  </action>
  <action Type="Eat" Belongto="Lunch">
    <actionid>3</actionid>
    <name>EatLunch</name>
    <ability>吃午饭</ability>
    <wait>4</wait>
  </action>
  <action Type="Eat" Belongto="Dinner">
    <actionid>4</actionid>
    <name>EatDinner</name>
    <ability>吃晚饭</ability>
    <wait>8</wait>
  </action>
  <action Type="Move" Belongto="Bed">
    <actionid>5</actionid>
    <name>GoToBed</name>
    <ability>晚上睡觉</ability>
    <wait>4</wait>
  </action>
</process>

        第三步,在Program.cs对应的完整代码如下,对照着复制到主函数中即可运行。

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

namespace CSharpParseXML
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            XmlDocument xd = new XmlDocument();
            xd.Load(@"E:\计算智能代码\CSharpParseXML\CSharpParseXML\process.xml");//加载xml文档
            XmlNode rootNode = xd.FirstChild;//得到xml文档的根节点<?xml version="1.0" encoding="utf-8" ?>
            rootNode = xd.SelectSingleNode("process");
            XmlNodeList childNodes = rootNode.ChildNodes;//得到根节点下面的所有子节点
            List<Action> actionList = new List<Action>();//创建character类型的列表
            foreach (XmlNode p in childNodes)
            {
   //遍历各个角色
                Action action = new Action();//创建一个角色,用来存储查询到的信息
                XmlNodeList contentList = p.ChildNodes;//得到该角色结点下的所有子节点
                XmlElement xe = (XmlElement)p;
                action.Type = xe.GetAttribute("Type").ToString();
                action.Belongto = xe.GetAttribute("Belongto").ToString();
                foreach (XmlNode content in contentList)
                {
   //遍历子节点
                    if (content.Name == "actionid")
                    {
   
                        action.ActionID = Int16.Parse(content.InnerText.ToString());
                    }
                    if (content.Name == "name")
                    {
   
                        action.Name = content.InnerText.ToString();
                    }
                    if (content.Name == "ability")
                    {
   
                        action.Ability = content.InnerText.ToString();
                    }
                    if (content.Name == "wait")
                    {
   
                        action.Wait = Int16.Parse(content.InnerText.ToString());
                    }
                }
                actionList.Add(action);//将创建的角色添加到角色列表
            }
            foreach (Action p in actionList)//遍历角色信息
                Console.WriteLine(p.ToString());
            Console.ReadKey();
        }
    }
    class Action
    {
   
        public Action() {
    }
        public string Type {
    get; set; }
        public string Belongto {
    get; set; }
        public int ActionID {
    get; set; }
        public string Name {
    get; set; }
        public string Ability {
    get; set; }
        public int Wait {
    get; set; }
        public override string ToString()
        {
            
            return string.Format("类型:{0}\t隶属于:{1}\t序号:{2}\t名称:{3}\t功能:{4}\t时长:{5}s", Type, Belongto, ActionID, Name, Ability, Wait);
        }
    }
}

        第四步,运行结果如下图所示,控制台输出了解析后的结果。


转载:https://blog.csdn.net/jing_zhong/article/details/117264741
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场