ToB企服应用市场:ToB评测及商务社交产业平台

标题: C# 读写json文件操纵 [打印本页]

作者: 徐锦洪    时间: 2024-7-20 05:47
标题: 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读写操纵类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Runtime.Serialization.Json;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace FileOperationsDemo
  9. {
  10.     public static class JsonHandle
  11.     {
  12.         /// <summary>
  13.         /// Json转换成对象
  14.         /// </summary>
  15.         /// <typeparam name="T"></typeparam>
  16.         /// <param name="jsonText"></param>
  17.         /// <returns></returns>
  18.         public static T JsonToObject<T>(string jsonText)
  19.         {
  20.             DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(T));
  21.             MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));
  22.             T obj = (T)s.ReadObject(ms);
  23.             ms.Dispose();
  24.             return obj;
  25.         }
  26.         /// <summary>
  27.         /// 对象转换成JSON
  28.         /// </summary>
  29.         /// <typeparam name="T"></typeparam>
  30.         /// <param name="obj"></param>
  31.         /// <returns></returns>
  32.         public static string ObjectToJSON<T>(T obj)
  33.         {
  34.             DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
  35.             string result = string.Empty;
  36.             using (MemoryStream ms = new MemoryStream())
  37.             {
  38.                 serializer.WriteObject(ms, obj);
  39.                 ms.Position = 0;
  40.                 using (StreamReader read = new StreamReader(ms))
  41.                 {
  42.                     result = read.ReadToEnd();
  43.                 }
  44.             }
  45.             return result;
  46.         }
  47.         /// <summary>
  48.         /// 将序列化的json字符串内容写入Json文件,并且保存
  49.         /// </summary>
  50.         /// <param name="path">路径</param>
  51.         /// <param name="jsonConents">Json内容</param>
  52.         public static void WriteJsonFile(string path, string jsonConents)
  53.         {
  54.             if (!File.Exists(path))  // 判断是否已有相同文件
  55.             {
  56.                 using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, FileShare.ReadWrite))
  57.                 {
  58.                     fs.Seek(0, SeekOrigin.Begin);
  59.                     fs.SetLength(0);
  60.                     using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
  61.                     {
  62.                         sw.WriteLine(jsonConents);
  63.                     }
  64.                 }
  65.             }
  66.         }
  67.         /// <summary>
  68.         /// 获取到本地的Json文件并且解析返回对应的json字符串
  69.         /// </summary>
  70.         /// <param name="filepath">文件路径</param>
  71.         /// <returns>Json内容</returns>
  72.         public static string GetJsonFile(string filepath)
  73.         {
  74.             string json = string.Empty;
  75.             using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, FileShare.ReadWrite))
  76.             {
  77.                 using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
  78.                 {
  79.                     json = sr.ReadToEnd().ToString();
  80.                 }
  81.             }
  82.             return json;
  83.         }
  84.     }
  85. }
复制代码
3、使用用例

  1.         /// <summary>
  2.         /// 读取JSON文件
  3.         /// </summary>
  4.         /// <param name="sender"></param>
  5.         /// <param name="e"></param>
  6.         private void button11_Click(object sender, EventArgs e)
  7.         {
  8.             openFileDialog1.Title = "Choose JSON File";
  9.             openFileDialog1.Filter = "JSON (*.json)|*.json";
  10.             openFileDialog1.Multiselect = false;
  11.             openFileDialog1.RestoreDirectory = true;
  12.             openFileDialog1.InitialDirectory = dir;
  13.             if (openFileDialog1.ShowDialog() == DialogResult.OK)
  14.             {
  15.                 // 获取文件
  16.                 string jsonTXT = JsonHandle.GetJsonFile(openFileDialog1.FileName);
  17.                 richTextBox5.AppendText(jsonTXT + "\n");
  18.             }
  19.         }
  20.         /// <summary>
  21.         /// 写入JSON文件
  22.         /// </summary>
  23.         /// <param name="sender"></param>
  24.         /// <param name="e"></param>
  25.         private void button12_Click(object sender, EventArgs e)
  26.         {
  27.             if (!string.IsNullOrEmpty(richTextBox5.Text.ToString().Trim()))
  28.             {
  29.                 // JSON反序列化:将JSON 字符串转换成对象
  30.                 UDPRecData refData_UDP = JsonHandle.JsonToObject<UDPRecData>(richTextBox5.Text.ToString().Trim());
  31.                 // JSON序列化:将对象转换成JSON 字符串
  32.                 string jsonFileDS = JsonHandle.ObjectToJSON<UDPRecData>(refData_UDP);
  33.                 saveFileOpen.Title = "保存文件";
  34.                 saveFileOpen.Filter = "JSON (*.json)|*.json";
  35.                 saveFileOpen.RestoreDirectory = true;
  36.                 saveFileOpen.InitialDirectory = dir;
  37.                 saveFileOpen.FilterIndex = 1;
  38.                 if (saveFileOpen.ShowDialog() == DialogResult.OK)
  39.                 {
  40.                     // 保存,输出JSON文件
  41.                     JsonHandle.WriteJsonFile(saveFileOpen.FileName, jsonFileDS);
  42.                 }
  43.             }
  44.         }
复制代码
别的,还需写一个与JSON数据布局一致的数据类。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.Serialization;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace FileOperationsDemo
  8. {
  9.     [DataContract]
  10.     public class UDPRecData
  11.     {
  12.         [DataMember(Order = 0)]
  13.         public Int32 id { get; set; }
  14.         [DataMember(Order = 1)]
  15.         public Identification ident { get; set; }
  16.         [DataMember(Order = 2)]
  17.         public TypeData type { get; set; }
  18.         [DataMember(Order = 3)]
  19.     }
  20.     [DataContract]
  21.     public class Identification
  22.     {
  23.         [DataMember(Order = 0)]
  24.         public string airline { get; set; }
  25.         [DataMember(Order = 1)]
  26.         public string reg { get; set; }
  27.         [DataMember(Order = 2)]
  28.         public string call { get; set; }
  29.         [DataMember(Order = 3)]
  30.         public string label { get; set; }
  31.     }
  32.     [DataContract]
  33.     public class TypeData
  34.     {
  35.         [DataMember(Order = 0)]
  36.         public string icao { get; set; }
  37.         [DataMember(Order = 1)]
  38.         public double wingSpan { get; set; }
  39.         [DataMember(Order = 2)]
  40.         public double wingArea { get; set; }
  41.     }
  42. }
复制代码
操纵的JSON文件
  1. {
  2.   "id" : 6711,
  3.   "ident" : {
  4.     "airline" : "DYH",
  5.     "reg" : "D-YVEL",
  6.     "call" : "llH1234",
  7.     "label" : "Test Temp"
  8.   },
  9.   "type" : {
  10.     "icao" : "Y72",
  11.     "wingSpan" : 11.1,
  12.     "wingArea" : 16.2
  13.   }
  14. }
复制代码

四、用字典提取Json

1、需要添加引用(System.Web.Extensions),用JavaScriptSerializer类(using System.Web.Script.Serialization;)反序列化,将字典作为类型提取JSON内数据。
  1.         private void Deserialize()
  2.         {
  3.             jsonExplorer.Nodes.Clear();
  4.             JavaScriptSerializer js = new JavaScriptSerializer();
  5.             try
  6.             {
  7.                 Dictionary<string, object> dic = js.Deserialize<Dictionary<string, object>>(txtInput.Text);
  8.                 TreeNode rootNode = new TreeNode("Root");
  9.                 jsonExplorer.Nodes.Add(rootNode);
  10.                 BuildTree(dic, rootNode);
  11.             }
  12.             catch (ArgumentException argE)
  13.             {
  14.                 MessageBox.Show("JSON data is not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  15.             }
  16.         }
复制代码
2、通过嵌套循环读取Json序列内数组数据,并将所有数据绑定到TreeView控件上。
  1.      public void BuildTree(Dictionary<string, object> dictionary, TreeNode node)
  2.         {
  3.             foreach (KeyValuePair<string, object> item in dictionary)
  4.             {
  5.                 TreeNode parentNode = new TreeNode(item.Key);
  6.                 node.Nodes.Add(parentNode);
  7.                 try
  8.                 {
  9.                     dictionary = (Dictionary<string, object>)item.Value;
  10.                     BuildTree(dictionary, parentNode);
  11.                 }
  12.                 catch (InvalidCastException dicE) {
  13.                     try
  14.                     {
  15.                         ArrayList list = (ArrayList)item.Value;
  16.                         foreach (string value in list)
  17.                         {
  18.                             TreeNode finalNode = new TreeNode(value);
  19.                             finalNode.ForeColor = Color.Blue;
  20.                             parentNode.Nodes.Add(finalNode);
  21.                         }
  22.                         
  23.                     }
  24.                     catch (InvalidCastException ex)
  25.                     {
  26.                         TreeNode finalNode = new TreeNode(item.Value.ToString());
  27.                         finalNode.ForeColor = Color.Blue;
  28.                         parentNode.Nodes.Add(finalNode);
  29.                     }
  30.                 }
  31.             }
  32.         }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4