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

Posted jing_zhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#解析JSON文件和XML文件(2021.05.26)相关的知识,希望对你有一定的参考价值。

前提环境(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后点击确定
在这里插入图片描述
        

以上是关于C#解析JSON文件和XML文件(2021.05.26)的主要内容,如果未能解决你的问题,请参考以下文章

C#合成解析XML与JSON

如何在 C# 中读取和解析 XML 文件?

C#利用newtonsoft.json读取.so配置文件内容

C# 解析 json

使用 C# 解析 XML 文件

统一读取和解析 C# 中的 Json 文件