引言
在現(xiàn)代軟件開發(fā)中,JSON(JavaScript Object Notation)已成為數(shù)據(jù)交換的事實標(biāo)準(zhǔn)格式。.NET Core 3.0及更高版本引入了System.Text.Json
命名空間,提供了一套高性能、低分配的JSON處理API。本文將基于一個Windows Forms示例,詳細(xì)介紹如何使用System.Text.Json
來構(gòu)建和解析JSON數(shù)據(jù)。
?
一、System.Text.Json簡介
System.Text.Json
是微軟提供的一個高性能JSON處理庫,相比傳統(tǒng)的Newtonsoft.Json
,它具有以下優(yōu)勢:
更高的性能
更低的內(nèi)存分配
與.NET運(yùn)行時深度集成
無需額外依賴
二、示例項目
開發(fā)軟件:Visual Studio 2022
目標(biāo)框架:.NET 8.0
我們的示例是一個Windows Forms應(yīng)用程序,包含兩個主要功能:
構(gòu)建JSON對象并顯示在RichTextBox中
解析JSON數(shù)據(jù)并提取信息顯示在另一個RichTextBox中
三、構(gòu)建JSON對象
創(chuàng)建基礎(chǔ)JSON對象
var jb = new JsonObject { };
jb["Code"] = "0";
jb["Desc"] = "成功";
這里我們創(chuàng)建了一個JsonObject
實例,并添加了兩個屬性:"Code"和"Desc"。
構(gòu)建JSON數(shù)組
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;
這段代碼展示了如何:
創(chuàng)建一個JsonArray
實例
遍歷城市數(shù)組,為每個城市創(chuàng)建JSON對象
將城市對象添加到數(shù)組中
將整個數(shù)組作為屬性添加到主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數(shù)據(jù)
解析JSON字符串
JsonNode jb = JsonNode.Parse(jsonText);
獲取頂層屬性
string str_Code = jb["Code"].GetValue<string>();
string str_Desc = jb["Desc"].GetValue<string>();
通過索引器訪問屬性,并使用GetValue<T>
方法獲取強(qiáng)類型值。
處理JSON數(shù)組
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()
將節(jié)點(diǎn)轉(zhuǎn)換為JsonArray
遍歷數(shù)組中的每個元素
提取每個城市對象的屬性
完整代碼
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功能更豐富,但在大多數(shù)場景下,System.Text.Json是更好的選擇:
更好的性能
更安全(默認(rèn)不自動類型轉(zhuǎn)換)
與.NET平臺更緊密集成
六、結(jié)論
通過這個Windows Forms示例,我們展示了如何使用System.Text.Json
高效地構(gòu)建和解析JSON數(shù)據(jù)。關(guān)鍵點(diǎn)包括:
使用JsonObject
和JsonArray
構(gòu)建復(fù)雜JSON結(jié)構(gòu)
利用JsonSerializerOptions
自定義序列化行為
通過JsonNode
API靈活訪問JSON數(shù)據(jù)
對于.NET開發(fā)者來說,掌握System.Text.Json
是處理現(xiàn)代Web API、配置文件和各種數(shù)據(jù)交換場景的重要技能。隨著.NET的持續(xù)發(fā)展,這個庫的功能和性能還將不斷提升,值得投入時間深入學(xué)習(xí)。
該文章在 2025/8/4 18:39:21 編輯過