引言
在现代软件开发中,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 编辑过