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