C# 读写json文件操作

Love朴啾啾 2024-10-18 15:05:01 阅读 78

一、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读写操作类

<code>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>code>

/// <param name="jsonText"></param>code>

/// <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>code>

/// <param name="obj"></param>code>

/// <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>code>

/// <param name="jsonConents">Json内容</param>code>

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>code>

/// <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>code>

/// <param name="e"></param>code>

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>code>

/// <param name="e"></param>code>

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内数据。

<code> 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);

}

}

}

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。