引言
在现代软件开发中,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
自定义序列化行为
通过JsonNode
API灵活访问JSON数据
对于.NET开发者来说,掌握System.Text.Json
是处理现代Web API、配置文件和各种数据交换场景的重要技能。随着.NET的持续发展,这个库的功能和性能还将不断提升,值得投入时间深入学习。
该文章在 2025/8/4 18:39:21 编辑过