引言
在现代软件开发中,JSON(JavaScript Object Notation)已成为数据交换的事实标准格式。.NET Core 3.0及更高版本引入了System.Text.Json命名空间,提供了一套高性能、低分配的JSON处理API。本文将基于一个Windows Forms示例,详细介绍如何使用System.Text.Json来构建和解析JSON数据。
一、System.Text.Json简介
System.Text.Json是微软提供的一个高性能JSON处理库,相比传统的Newtonsoft.Json,它具有以下优势:
更高的性能
更低的内存分配
与.NET运行时深度集成
无需额外依赖
二、示例项目
开发软件:Visual Studio 2022
目标框架:.NET 8.0
我们的示例是一个Windows Forms应用程序,包含两个主要功能:
构建JSON对象并显示在RichTextBox中
解析JSON数据并提取信息显示在另一个RichTextBox中
三、构建JSON对象
创建基础JSON对象
var jb = new JsonObject { };jb["Code"] = "0";jb["Desc"] = "成功";
这里我们创建了一个JsonObject实例,并添加了两个属性:"Code"和"Desc"。
构建JSON数组
string[] city = { "北京", "上海" };var cityArray = new JsonArray();
for (int i = 0; i < city.Length; i++){ var temp = new JsonObject(); temp["Code"] = (i + 1).ToString(); temp["Name"] = city[i]; cityArray.Add(temp);}
jb["City"] = cityArray;
这段代码展示了如何:
创建一个JsonArray实例
遍历城市数组,为每个城市创建JSON对象
将城市对象添加到数组中
将整个数组作为属性添加到主JSON对象
序列化选项
var options = new JsonSerializerOptions{ WriteIndented = true, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping};
JsonSerializerOptions允许我们自定义序列化行为:
最终生成的JSON
{ "Code": "0", "Desc": "成功", "City": [ { "Code": "1", "Name": "北京" }, { "Code": "2", "Name": "上海" } ]}
完整代码:
private void button1_Click(object sender, EventArgs e) { string[] city = { "北京", "上海" };
var jb = new JsonObject { }; jb["Code"] = "0"; jb["Desc"] = "成功";
var cityArray = new JsonArray(); for (int i = 0; i < city.Length; i++) { var temp = new JsonObject();
temp["Code"] = (i + 1).ToString(); temp["Name"] = city[i];
cityArray.Add(temp); }
jb["City"] = cityArray;
var options = new JsonSerializerOptions { WriteIndented = true, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping };
richTextBox1.Text = jb.ToJsonString(options); }
效果:
四、解析JSON数据
解析JSON字符串
JsonNode jb = JsonNode.Parse(jsonText);
获取顶层属性
string str_Code = jb["Code"].GetValue<string>();string str_Desc = jb["Desc"].GetValue<string>();
通过索引器访问属性,并使用GetValue<T>方法获取强类型值。
处理JSON数组
JsonArray cityArray = jb["City"].AsArray();
foreach (JsonNode cityNode in cityArray){ string str_InfoCode = cityNode["Code"].GetValue<string>(); string str_InfoName = cityNode["Name"].GetValue<string>(); }
使用AsArray()将节点转换为JsonArray
遍历数组中的每个元素
提取每个城市对象的属性
完整代码
private void button2_Click(object sender, EventArgs e){ string jsonText = richTextBox1.Text;
JsonNode jb = JsonNode.Parse(jsonText);
string str_Code = jb["Code"].GetValue<string>(); string str_Desc = jb["Desc"].GetValue<string>();
richTextBox2.AppendText("Code:" + str_Code); richTextBox2.AppendText("-"); richTextBox2.AppendText("Desc:" + str_Desc); richTextBox2.AppendText("\r\n");
JsonArray cityArray = jb["City"].AsArray();
foreach (JsonNode cityNode in cityArray) { string str_InfoCode = cityNode["Code"].GetValue<string>(); string str_InfoName = cityNode["Name"].GetValue<string>();
richTextBox2.AppendText("cityCode:" + str_InfoCode); richTextBox2.AppendText("-"); richTextBox2.AppendText("cityName:" + str_InfoName); richTextBox2.AppendText("\r\n"); }}
效果
五、对于高性能场景,可以考虑:
与Newtonsoft.Json对比
虽然Newtonsoft.Json功能更丰富,但在大多数场景下,System.Text.Json是更好的选择:
更好的性能
更安全(默认不自动类型转换)
与.NET平台更紧密集成
六、结论
通过这个Windows Forms示例,我们展示了如何使用System.Text.Json高效地构建和解析JSON数据。关键点包括:
使用JsonObject和JsonArray构建复杂JSON结构
利用JsonSerializerOptions自定义序列化行为
通过JsonNodeAPI灵活访问JSON数据
对于.NET开发者来说,掌握System.Text.Json是处理现代Web API、配置文件和各种数据交换场景的重要技能。随着.NET的持续发展,这个库的功能和性能还将不断提升,值得投入时间深入学习。
该文章在 2025/8/4 18:39:21 编辑过