一、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);
- }
- }
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |