C# JSON 序列化(原生 + 第三方Newtonsoft) 的使用
一、JSON 基礎(chǔ)語法規(guī)則(必考)
1. 核心格式
{}代表 單個(gè)對(duì)象[]代表 數(shù)組/集合- JSON 屬性名必須帶雙引號(hào)
- 屬性值不能為函數(shù),只能是字符串、數(shù)字、布爾、數(shù)組、對(duì)象
- 最后一個(gè)屬性末尾不能加逗號(hào),否則格式報(bào)錯(cuò)
標(biāo)準(zhǔn)JSON示例
[
{
"name": "張三",
"age": 10
},
{
"name": "李四",
"age": 12
}
]二、原生JSON序列化(DataContractJsonSerializer)
1. 環(huán)境配置(必須操作)
原生JSON工具類需要手動(dòng)添加程序集引用:
項(xiàng)目引用 → 右鍵添加引用 → 程序集搜索 System.Runtime.Serialization → 勾選引入
命名空間:using System.Runtime.Serialization.Json;
2. 實(shí)體類說明
原生JSON序列化 不需要 [Serializable] 特性(和二進(jìn)制序列化區(qū)別),可直接使用普通實(shí)體類。
public class People
{
public string Name { get; set; }
public string Age { get; set; }
public string Sex { get; set; }
}
3. 原生JSON 序列化(寫入文件)
對(duì)象 → JSON字符串 → 寫入本地文件
private void button1_Click(object sender, EventArgs e)
{
// 1. 實(shí)例化對(duì)象,接收頁(yè)面數(shù)據(jù)
People p1 = new People()
{
Name = textBox1.Text,
Age = textBox2.Text,
Sex = textBox3.Text,
};
// 2. 創(chuàng)建文件流,覆蓋寫入
FileStream fs = new FileStream(@"1.txt", FileMode.Create);
// 3. 原生JSON序列化工具,綁定實(shí)體類型
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(People));
// 4. 序列化寫入文件
ds.WriteObject(fs, p1);
// 5. 釋放資源
fs.Close();
fs.Dispose();
}
4. 原生JSON 反序列化(讀取文件)
本地JSON文件 → 還原為實(shí)體對(duì)象
private void button2_Click(object sender, EventArgs e)
{
// 1. 打開文件流
FileStream fs = new FileStream(@"1.txt", FileMode.Open);
// 2. 創(chuàng)建序列化工具
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(People));
// 3. 反序列化 + 強(qiáng)制類型轉(zhuǎn)換
People p1 = (People)ds.ReadObject(fs);
// 4. 數(shù)據(jù)展示
this.Text = p1.Name;
// 5. 釋放資源
fs.Close();
fs.Dispose();
}
5. 原生JSON優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):系統(tǒng)自帶、無需下載第三方包、無版本沖突
- 缺點(diǎn):語法繁瑣、不支持直接序列化集合、適配復(fù)雜JSON較差
三、第三方JSON(Newtonsoft.Json)超重點(diǎn)
1. NuGet 安裝步驟
右鍵項(xiàng)目 → 管理NuGet程序包 → 瀏覽 → 搜索 Newtonsoft.Json → 下載安裝
命名空間:using Newtonsoft.Json;
2. 實(shí)體類
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public string Info { get; set; }
}
3. 集合初始化
List<Student> list = new List<Student>();
public Form1()
{
InitializeComponent();
// 循環(huán)批量生成測(cè)試數(shù)據(jù)
for (int i = 0; i < 10; i++)
{
Student s1 = new Student()
{
Name = "哈蘭德" + i,
Age = i * 10,
Info = "前鋒"
};
list.Add(s1);
}
}
4. 第三方序列化(超級(jí)簡(jiǎn)潔)
對(duì)象/集合 轉(zhuǎn) JSON字符串,一行代碼完成
private void button1_Click(object sender, EventArgs e)
{
// 集合序列化為JSON字符串
string data = JsonConvert.SerializeObject(list);
// 寫入本地文件
File.WriteAllText(@"1.txt", data);
}
5. 第三方反序列化
JSON字符串 還原 集合/對(duì)象
private void button2_Click(object sender, EventArgs e)
{
// 讀取本地JSON文本
string data = File.ReadAllText(@"1.txt");
// 反序列化為學(xué)生集合
List<Student> s1 = JsonConvert.DeserializeObject<List<Student>>(data);
// 遍歷展示數(shù)據(jù)
string ss = "";
foreach (var item in s1)
{
ss += item.Name;
}
this.Text = ss;
}
四、復(fù)雜JSON嵌套解析(實(shí)戰(zhàn)項(xiàng)目級(jí))
1. 多層嵌套實(shí)體類
適配接口/小說圖文類JSON數(shù)據(jù),多層嵌套實(shí)體映射
private void button3_Click(object sender, EventArgs e)
{
// 讀取復(fù)雜JSON文件
string data = File.ReadAllText(@"漫畫.txt", Encoding.Default);
// 反序列化為根對(duì)象
XiaoShuoRoot root = JsonConvert.DeserializeObject<XiaoShuoRoot>(data);
// 遍歷文本數(shù)據(jù)展示
foreach (var item in root.hits.topicMessageList)
{
richTextBox1.Text += item.author_name + "\n";
}
// 動(dòng)態(tài)創(chuàng)建圖片控件排版
createPic(panel1, 2, 8, 100, 100, 10, root.hits.topicMessageList);
}
// 圖片、作者信息節(jié)點(diǎn)
public class TopicMessageList
{
public string cover_image_url { get; set; }
public string author_name { get; set; }
}
// 數(shù)據(jù)集合節(jié)點(diǎn)
public class Hits
{
public List<TopicMessageList> topicMessageList { get; set; }
}
// JSON根節(jié)點(diǎn)
public class XiaoShuoRoot
{
public int code { get; set; }
public string message { get; set; }
public int total { get; set; }
public Hits hits { get; set; }
}
2. 復(fù)雜JSON解析 + 動(dòng)態(tài)創(chuàng)建控件
讀取本地JSON → 解析嵌套數(shù)據(jù) → 動(dòng)態(tài)生成PictureBox圖片控件排版展示
private void button3_Click(object sender, EventArgs e)
{
// 讀取復(fù)雜JSON文件
string data = File.ReadAllText(@"漫畫.txt", Encoding.Default);
// 反序列化為根對(duì)象
XiaoShuoRoot root = JsonConvert.DeserializeObject<XiaoShuoRoot>(data);
// 遍歷文本數(shù)據(jù)展示
foreach (var item in root.hits.topicMessageList)
{
richTextBox1.Text += item.author_name + "\n";
}
// 動(dòng)態(tài)創(chuàng)建圖片控件排版
createPic(panel1, 2, 8, 100, 100, 10, root.hits.topicMessageList);
}
3. 動(dòng)態(tài)PictureBox生成方法
自動(dòng)行列排版、設(shè)置大小、間距、圖片路徑、邊框樣式
/// <summary>
/// 動(dòng)態(tài)批量創(chuàng)建PictureBox圖片控件
/// </summary>
private void createPic(Panel p1, int rows, int col, int width, int height, int space, List<TopicMessageList> a)
{
int count = -1;
int startX = 10; // 起始X坐標(biāo)
int startY = 10; // 起始Y坐標(biāo)
// 雙層循環(huán)實(shí)現(xiàn)行列排版
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < col; j++)
{
count++;
PictureBox pic = new PictureBox()
{
BorderStyle = BorderStyle.FixedSingle, // 邊框樣式
Width = width,
Height = height,
SizeMode = PictureBoxSizeMode.StretchImage, // 圖片拉伸適配
BackColor = Color.Red,
ImageLocation = a[count].cover_image_url // 網(wǎng)絡(luò)圖片地址
};
// 設(shè)置控件坐標(biāo)
pic.Left = startX + j * (width + space);
pic.Top = startY + i * (height + space);
// 添加到容器
p1.Controls.Add(pic);
}
}
}
五、原生JSON VS 第三方JSON(核心對(duì)比)
對(duì)比項(xiàng) | 原生 DataContractJsonSerializer | 第三方 Newtonsoft.Json |
|---|---|---|
安裝方式 | 系統(tǒng)自帶,添加程序集引用 | NuGet手動(dòng)安裝 |
語法簡(jiǎn)潔度 | 繁瑣,需手動(dòng)操作文件流 | 極簡(jiǎn),一行代碼序列化/反序列化 |
集合支持 | 支持差,寫法復(fù)雜 | 完美支持集合、嵌套JSON |
適用場(chǎng)景 | 簡(jiǎn)單單個(gè)對(duì)象序列化 | 項(xiàng)目開發(fā)、接口解析、復(fù)雜數(shù)據(jù) |
六、全套易錯(cuò)點(diǎn)匯總
- JSON格式最后一個(gè)字段不能加逗號(hào),否則解析失敗
- 原生JSON必須手動(dòng)引入 System.Runtime.Serialization 程序集
- 第三方JSON必須安裝NuGet包,否則無法識(shí)別JsonConvert
- 反序列化實(shí)體結(jié)構(gòu)必須和JSON結(jié)構(gòu)完全對(duì)應(yīng)(字段名、嵌套層級(jí))
- 動(dòng)態(tài)控件創(chuàng)建需設(shè)置坐標(biāo),否則所有控件重疊在一起
- 二進(jìn)制序列化需要 [Serializable],JSON序列化不需要
七、背誦口訣
JSON大括號(hào)對(duì)象,中括號(hào)存數(shù)組行;
原生需引程序集,寫法繁瑣流手動(dòng);
第三方包NuGet裝,一行代碼轉(zhuǎn)陰陽(yáng);
嵌套數(shù)據(jù)實(shí)體配,動(dòng)態(tài)控件排版強(qiáng)。
到此這篇關(guān)于C# JSON 序列化(原生 + 第三方Newtonsoft) 的使用的文章就介紹到這了,更多相關(guān)C# JSON 序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用Spire.XLS for .NET將Excel轉(zhuǎn)換為SVG圖片
在C#開發(fā)中,C# Excel轉(zhuǎn)換為SVG的需求日益增長(zhǎng),尤其Web應(yīng)用中Excel矢量預(yù)覽已成為痛點(diǎn)解決關(guān)鍵,本文客觀分享實(shí)現(xiàn)路徑與代碼,幫助C#開發(fā)者快速集成,提升項(xiàng)目效率,需要的朋友可以參考下2026-03-03
C#使用System.Net庫(kù)實(shí)現(xiàn)自動(dòng)發(fā)送郵件功能
在C#編程環(huán)境中,實(shí)現(xiàn)郵件發(fā)送功能是一項(xiàng)常見的需求,無論是Web應(yīng)用程序還是Windows窗體應(yīng)用程序,下面小編就來為大家講講如何使用System.Net庫(kù)實(shí)現(xiàn)這一功能吧2025-03-03
C# 使用Microsoft Edge WebView2的相關(guān)總結(jié)
這篇文章主要介紹了C# 使用Microsoft Edge WebView2的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02

