C#读写json文件操作的正确方法

 更新时间:2024年07月17日 10:43:19   作者:Love朴啾啾  
在现代开发中JSON已经成为了一种非常流行的数据格式,下面这篇文章主要给大家介绍了关于C#读写json文件操作的正确方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、JSON 文件

JSON(全称为JavaScript Object Notation,JavaScript 对象表示法) 是一种轻量级的数据交换格式,用于存储和交换文本信息的语法,类似 XML。它是基于JavaScript语法标准的一个子集,但它独立于 JavaScript,因此许多程序环境能够读取(解读)和生成 JSON。

JavaScript 对象表示法(JSON)是用于将结构化数据表示为 JavaScript 对象的标准格式,通常用于在网站上表示和传输数据(例如从服务器向客户端发送一些数据,因此可以将其显示在网页上)。JSON 可以作为一个对象或者字符串存在,前者用于解读 JSON 中的数据,后者用于通过网络传输 JSON 数据。

二、JSON 语法规则

JSON数据由键值对组成,每个键值对之间用逗号分隔,整个数据以大括号 {} 包裹表示一个对象,或者以中括号 [] 包裹表示一个数组。基本语法结构如下:
1、对象(Object):使用大括号 {} 包裹,键值对之间使用冒号 : 分隔,如 { “name”: “John”, “age”: 30 }。

2、数组(Array):使用中括号 [] 包裹,元素之间使用逗号 , 分隔,如 [ “apple”, “banana”, “orange” ]。

3、使用斜杆 \ 来转义字符。

4、大括号 {} 保存对象,对象可以包含多个数组。

5、中括号 [] 保存数组,数组可以包含多个对象。

三、JSON读取操作类

1、添加 System.Runtime.Serialization 程序集文件

系统程序集文件中有能操作 JSON 文件的 API库文件,在项目 “引用” 上右键,点击“添加引用” ,打开“引用管理器”窗口。

在程序集中找到 System.Runtime.Serialization ,选中后点击确定。将 System.Runtime.Serialization 文件添加到项目引用中。

2、JSON读写操作类

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

namespace FileOperationsDemo
{
    public static class JsonHandle
    {
        /// <summary>
        /// Json转换成对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jsonText"></param>
        /// <returns></returns>
        public static T JsonToObject<T>(string jsonText)
        {
            DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));
            T obj = (T)s.ReadObject(ms);
            ms.Dispose();
            return obj;
        }
        /// <summary>
        /// 对象转换成JSON
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ObjectToJSON<T>(T obj)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            string result = string.Empty;
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, obj);
                ms.Position = 0;

                using (StreamReader read = new StreamReader(ms))
                {
                    result = read.ReadToEnd();
                }
            }
            return result;
        }
        /// <summary>
        /// 将序列化的json字符串内容写入Json文件,并且保存
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="jsonConents">Json内容</param>
        public static void WriteJsonFile(string path, string jsonConents)
        {
            if (!File.Exists(path))  // 判断是否已有相同文件 
            {
                using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    fs.Seek(0, SeekOrigin.Begin);
                    fs.SetLength(0);
                    using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
                    {
                        sw.WriteLine(jsonConents);
                    }
                }
            }
        }
        /// <summary>
        /// 获取到本地的Json文件并且解析返回对应的json字符串
        /// </summary>
        /// <param name="filepath">文件路径</param>
        /// <returns>Json内容</returns>
        public static string GetJsonFile(string filepath)
        {
            string json = string.Empty;
            using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
                {
                    json = sr.ReadToEnd().ToString();
                }
            }
            return json;
        }
    }
}

3、使用用例

        /// <summary>
        /// 读取JSON文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button11_Click(object sender, EventArgs e)
        {
            openFileDialog1.Title = "Choose JSON File";
            openFileDialog1.Filter = "JSON (*.json)|*.json";
            openFileDialog1.Multiselect = false;
            openFileDialog1.RestoreDirectory = true;
            openFileDialog1.InitialDirectory = dir;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                // 获取文件
                string jsonTXT = JsonHandle.GetJsonFile(openFileDialog1.FileName);
                richTextBox5.AppendText(jsonTXT + "\n");
            }
        }
        /// <summary>
        /// 写入JSON文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button12_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(richTextBox5.Text.ToString().Trim()))
            {
                // JSON反序列化:将JSON 字符串转换成对象
                UDPRecData refData_UDP = JsonHandle.JsonToObject<UDPRecData>(richTextBox5.Text.ToString().Trim());
                // JSON序列化:将对象转换成JSON 字符串 
                string jsonFileDS = JsonHandle.ObjectToJSON<UDPRecData>(refData_UDP);

                saveFileOpen.Title = "保存文件";
                saveFileOpen.Filter = "JSON (*.json)|*.json";
                saveFileOpen.RestoreDirectory = true;
                saveFileOpen.InitialDirectory = dir;
                saveFileOpen.FilterIndex = 1;
                if (saveFileOpen.ShowDialog() == DialogResult.OK)
                {
                    // 保存,输出JSON文件
                    JsonHandle.WriteJsonFile(saveFileOpen.FileName, jsonFileDS);
                }
            }
        }

此外,还需写一个与JSON数据结构一致的数据类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace FileOperationsDemo
{
    [DataContract]
    public class UDPRecData
    {
        [DataMember(Order = 0)]
        public Int32 id { get; set; }
        [DataMember(Order = 1)]
        public Identification ident { get; set; }
        [DataMember(Order = 2)]
        public TypeData type { get; set; }
        [DataMember(Order = 3)]
    }
    [DataContract]
    public class Identification
    {
        [DataMember(Order = 0)]
        public string airline { get; set; }
        [DataMember(Order = 1)]
        public string reg { get; set; }
        [DataMember(Order = 2)]
        public string call { get; set; }
        [DataMember(Order = 3)]
        public string label { get; set; }
    }
    [DataContract]
    public class TypeData
    {
        [DataMember(Order = 0)]
        public string icao { get; set; }
        [DataMember(Order = 1)]
        public double wingSpan { get; set; }
        [DataMember(Order = 2)]
        public double wingArea { get; set; }
    }
}

操作的JSON文件

{
  "id" : 6711,
  "ident" : {
    "airline" : "DYH",
    "reg" : "D-YVEL",
    "call" : "llH1234",
    "label" : "Test Temp"
  },
  "type" : {
    "icao" : "Y72",
    "wingSpan" : 11.1,
    "wingArea" : 16.2
  }
}

四、用字典提取Json

1、需要添加引用(System.Web.Extensions),用JavaScriptSerializer类(using System.Web.Script.Serialization;)反序列化,将字典作为类型提取JSON内数据。

        private void Deserialize()
        {
            jsonExplorer.Nodes.Clear();
            JavaScriptSerializer js = new JavaScriptSerializer();

            try
            {
                Dictionary<string, object> dic = js.Deserialize<Dictionary<string, object>>(txtInput.Text);

                TreeNode rootNode = new TreeNode("Root");
                jsonExplorer.Nodes.Add(rootNode);
                BuildTree(dic, rootNode);
            }
            catch (ArgumentException argE)
            {
                MessageBox.Show("JSON data is not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

2、通过嵌套循环读取Json序列内数组数据,并将所有数据绑定到TreeView控件上。

     public void BuildTree(Dictionary<string, object> dictionary, TreeNode node)
        {
            foreach (KeyValuePair<string, object> item in dictionary)
            {
                TreeNode parentNode = new TreeNode(item.Key);
                node.Nodes.Add(parentNode);

                try
                {
                    dictionary = (Dictionary<string, object>)item.Value;
                    BuildTree(dictionary, parentNode);
                }
                catch (InvalidCastException dicE) {
                    try
                    {
                        ArrayList list = (ArrayList)item.Value;
                        foreach (string value in list)
                        {
                            TreeNode finalNode = new TreeNode(value);
                            finalNode.ForeColor = Color.Blue;
                            parentNode.Nodes.Add(finalNode);
                        }
                        
                    }
                    catch (InvalidCastException ex)
                    {
                        TreeNode finalNode = new TreeNode(item.Value.ToString());
                        finalNode.ForeColor = Color.Blue;
                        parentNode.Nodes.Add(finalNode);
                    }
                }
            }
        }

总结 

到此这篇关于C#读写json文件操作正确方法的文章就介绍到这了,更多相关C#读写json文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# 实现截图软件功能实例代码

    C# 实现截图软件功能实例代码

    这篇文章主要介绍了C# 实现截图软件功能实例代码,需要的朋友可以参考下
    2017-06-06
  • WCF的异常处理

    WCF的异常处理

    这篇文章介绍了WCF处理异常的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#遍历文件夹及其子目录的完整实现方法

    C#遍历文件夹及其子目录的完整实现方法

    这篇文章主要介绍了C#遍历文件夹及其子目录的方法,涉及C#文件与目录的基本操作技巧,简单实用,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C# OpenCvSharp实现通过特征点匹配图片

    C# OpenCvSharp实现通过特征点匹配图片

    这篇文章主要为大家详细介绍了C#如何结合OpenCVSharp4实现通过特征点匹配图片,文中的示例代码简洁易懂,具有一定的学习价值,需要的小伙伴可以参考下
    2023-11-11
  • asp.net页面中如何获取Excel表的内容

    asp.net页面中如何获取Excel表的内容

    在浏览网页时,一定会看到我们需要保存的信息,我们比较常用的方法就是拖动鼠标,选中我们需要的内容,然后ctrl+c,然后在保持到excel当中去,那么如何用asp.net获取excel表的内容呢,下面小编就给大家介绍asp.net获取excel表的内容,需要的朋友可以参考下
    2015-08-08
  • C#结合Free Spire.PDF实现删除PDF中的数字签名

    C#结合Free Spire.PDF实现删除PDF中的数字签名

    这篇文章主要为大家详细介绍了C#如何结合Free Spire.PDF实现删除PDF中的数字签名,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2026-03-03
  • C#实现毫秒转换成时分秒的方法

    C#实现毫秒转换成时分秒的方法

    这篇文章主要介绍了C#实现毫秒转换成时分秒的方法,涉及C#时间的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C# jpg缩略图函数代码

    C# jpg缩略图函数代码

    生成jpg缩略图字节,本人的小软件中需要用到的功能,所以自己做了一个函数,和大家分享 为什么要生成字节而不是文件,这是为了方便后续处理啦^_^
    2011-06-06
  • WinForm中BackgroundWorker控件用法简单实例

    WinForm中BackgroundWorker控件用法简单实例

    这篇文章主要介绍了WinForm中BackgroundWorker控件用法,以一个简单实例形式分析了BackgroundWorker控件的定义、设置及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 基于C#的图表控件库 ScottPlot编译visual studio 2022

    基于C#的图表控件库 ScottPlot编译visual studio 2022

    基于 C# 的 图表控件库 ScottPlot,开源免费,可以用于开发一些上位机软件,如电压、电流波形的显示,开发【示波器】图形界面,可以显示一些图表、波形,总之功能比较的强大,本文介绍了基于C#的图表控件库 ScottPlot编译visual studio 2022,需要的朋友可以参考下
    2022-06-06

最新评论