一、JSON 基础语法规则(必考)
1. 核心格式
{}代表 单个对象[]代表 数组/集合- JSON 属性名必须带双引号
- 属性值不能为函数,只能是字符串、数字、布尔、数组、对象
- 最后一个属性末尾不能加逗号,否则格式报错
标准JSON示例
[
{
"name": "张三",
"age": 10
},
{
"name": "李四",
"age": 12
}
]
二、原生JSON序列化(DataContractJsonSerializer)
1. 环境配置(必须操作)
原生JSON工具类需要手动添加程序集引用:
项目引用 → 右键添加引用 → 程序集搜索 System.Runtime.Serialization → 勾选引入
命名空间:using System.Runtime.Serialization.Json;
2. 实体类说明
原生JSON序列化 不需要 [Serializable] 特性(和二进制序列化区别),可直接使用普通实体类。
public class People
{
public string Name { get; set; }
public string Age { get; set; }
public string Sex { get; set; }
}
3. 原生JSON 序列化(写入文件)
对象 → JSON字符串 → 写入本地文件
private void button1_Click(object sender, EventArgs e)
{
// 1. 实例化对象,接收页面数据
People p1 = new People()
{
Name = textBox1.Text,
Age = textBox2.Text,
Sex = textBox3.Text,
};
// 2. 创建文件流,覆盖写入
FileStream fs = new FileStream(@"1.txt", FileMode.Create);
// 3. 原生JSON序列化工具,绑定实体类型
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(People));
// 4. 序列化写入文件
ds.WriteObject(fs, p1);
// 5. 释放资源
fs.Close();
fs.Dispose();
}
4. 原生JSON 反序列化(读取文件)
本地JSON文件 → 还原为实体对象
private void button2_Click(object sender, EventArgs e)
{
// 1. 打开文件流
FileStream fs = new FileStream(@"1.txt", FileMode.Open);
// 2. 创建序列化工具
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(People));
// 3. 反序列化 + 强制类型转换
People p1 = (People)ds.ReadObject(fs);
// 4. 数据展示
this.Text = p1.Name;
// 5. 释放资源
fs.Close();
fs.Dispose();
}
5. 原生JSON优缺点
- 优点:系统自带、无需下载第三方包、无版本冲突
- 缺点:语法繁琐、不支持直接序列化集合、适配复杂JSON较差
三、第三方JSON(Newtonsoft.Json)超重点
1. NuGet 安装步骤
右键项目 → 管理NuGet程序包 → 浏览 → 搜索 Newtonsoft.Json → 下载安装
命名空间:using Newtonsoft.Json;
2. 实体类
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();
// 循环批量生成测试数据
for (int i = 0; i < 10; i++)
{
Student s1 = new Student()
{
Name = "哈兰德" + i,
Age = i * 10,
Info = "前锋"
};
list.Add(s1);
}
}
4. 第三方序列化(超级简洁)
对象/集合 转 JSON字符串,一行代码完成
private void button1_Click(object sender, EventArgs e)
{
// 集合序列化为JSON字符串
string data = JsonConvert.SerializeObject(list);
// 写入本地文件
File.WriteAllText(@"1.txt", data);
}
5. 第三方反序列化
JSON字符串 还原 集合/对象
private void button2_Click(object sender, EventArgs e)
{
// 读取本地JSON文本
string data = File.ReadAllText(@"1.txt");
// 反序列化为学生集合
List<Student> s1 = JsonConvert.DeserializeObject<List<Student>>(data);
// 遍历展示数据
string ss = "";
foreach (var item in s1)
{
ss += item.Name;
}
this.Text = ss;
}
四、复杂JSON嵌套解析(实战项目级)
1. 多层嵌套实体类
适配接口/小说图文类JSON数据,多层嵌套实体映射
private void button3_Click(object sender, EventArgs e)
{
// 读取复杂JSON文件
string data = File.ReadAllText(@"漫画.txt", Encoding.Default);
// 反序列化为根对象
XiaoShuoRoot root = JsonConvert.DeserializeObject<XiaoShuoRoot>(data);
// 遍历文本数据展示
foreach (var item in root.hits.topicMessageList)
{
richTextBox1.Text += item.author_name + "\n";
}
// 动态创建图片控件排版
createPic(panel1, 2, 8, 100, 100, 10, root.hits.topicMessageList);
}
// 图片、作者信息节点
public class TopicMessageList
{
public string cover_image_url { get; set; }
public string author_name { get; set; }
}
// 数据集合节点
public class Hits
{
public List<TopicMessageList> topicMessageList { get; set; }
}
// JSON根节点
public class XiaoShuoRoot
{
public int code { get; set; }
public string message { get; set; }
public int total { get; set; }
public Hits hits { get; set; }
}
2. 复杂JSON解析 + 动态创建控件
读取本地JSON → 解析嵌套数据 → 动态生成PictureBox图片控件排版展示
private void button3_Click(object sender, EventArgs e)
{
// 读取复杂JSON文件
string data = File.ReadAllText(@"漫画.txt", Encoding.Default);
// 反序列化为根对象
XiaoShuoRoot root = JsonConvert.DeserializeObject<XiaoShuoRoot>(data);
// 遍历文本数据展示
foreach (var item in root.hits.topicMessageList)
{
richTextBox1.Text += item.author_name + "\n";
}
// 动态创建图片控件排版
createPic(panel1, 2, 8, 100, 100, 10, root.hits.topicMessageList);
}
3. 动态PictureBox生成方法
自动行列排版、设置大小、间距、图片路径、边框样式
/// <summary>
/// 动态批量创建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坐标
int startY = 10; // 起始Y坐标
// 双层循环实现行列排版
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 // 网络图片地址
};
// 设置控件坐标
pic.Left = startX + j * (width + space);
pic.Top = startY + i * (height + space);
// 添加到容器
p1.Controls.Add(pic);
}
}
}
五、原生JSON VS 第三方JSON(核心对比)
|
对比项 |
原生 DataContractJsonSerializer |
第三方 Newtonsoft.Json |
|---|---|---|
|
安装方式 |
系统自带,添加程序集引用 |
NuGet手动安装 |
|
语法简洁度 |
繁琐,需手动操作文件流 |
极简,一行代码序列化/反序列化 |
|
集合支持 |
支持差,写法复杂 |
完美支持集合、嵌套JSON |
|
适用场景 |
简单单个对象序列化 |
项目开发、接口解析、复杂数据 |
六、全套易错点汇总
- JSON格式最后一个字段不能加逗号,否则解析失败
- 原生JSON必须手动引入 System.Runtime.Serialization 程序集
- 第三方JSON必须安装NuGet包,否则无法识别JsonConvert
- 反序列化实体结构必须和JSON结构完全对应(字段名、嵌套层级)
- 动态控件创建需设置坐标,否则所有控件重叠在一起
- 二进制序列化需要 [Serializable],JSON序列化不需要
七、背诵口诀
JSON大括号对象,中括号存数组行;
原生需引程序集,写法繁琐流手动;
第三方包NuGet装,一行代码转阴阳;
嵌套数据实体配,动态控件排版强。













