JSON序列化(DataContractJsonSerializer)
一、JSON 基础语法规则
1、{ } 代表单个对象
2、 代表数组/集合
3、JSON 严格语法:
① 属性名必须加双引号 ""
② 属性值不能写函数
③ 最后一个属性不能加逗号
4、JSON 格式示例(对象数组)
[
{
"name":"张三",
"age":10
},
{
"name":"张三",
"age":10
}
]
二、环境配置(必须操作)
如果代码没有 DataContractJsonSerializer 提示,需要手动添加引用:
1、项目 → 引用 → 程序集
2、搜索:System.Runtime.Serialization 并添加
3、引入命名空间:
using System.Runtime.Serialization.Json;
三、实体类代码
public class People
{
public string Name { get; set; }
public string Age { get; set; }
public string Sex { get; set; }
}
说明:JSON序列化不需要 Serializable 特性(二进制序列化才需要)
四、JSON 序列化(写入本地 button1)
功能:C#对象 → JSON格式 → 写入本地 1.txt
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();
}
五、JSON 反序列化(读取本地 button2)
功能:读取本地JSON文件 → 还原为C#对象
private void button2_Click(object sender, EventArgs e)
{
//1.打开文件流
FileStream fs = new FileStream(@"1.txt", FileMode.Open);
//2.创建JSON序列化器
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(People));
//3.反序列化:读取文件转为对象,强制类型转换
People p1 = (People)ds.ReadObject(fs);
//4.释放资源
fs.Close();
fs.Dispose();
//5.读取数据展示
this.Text = p1.Name;
}
六、核心方法解析
1、DataContractJsonSerializer:JSON序列化工具类
2、WriteObject(流,对象):序列化,对象写入文件
3、ReadObject(流):反序列化,读取文件返回object
4、typeof(类名):告诉序列化器要转换的对象类型
七、FileMode 说明
FileMode.Create:创建/覆盖文件,每次写入覆盖旧数据
FileMode.Open:打开已有文件,用于读取
八、知识点总结
1、二进制序列化需要 Serializable,JSON不需要
2、JSON格式可读性极强,常用于前后端数据交互、配置文件
3、序列化:对象 → JSON文本
4、反序列化:JSON文本 → 对象
九、易错点
1、未添加 System.Runtime.Serialization 引用,代码报错
2、JSON语法不规范(多余逗号、属性无引号)导致反序列化失败
3、读写类型不匹配,转换报错
4、文件流未关闭,文件被占用锁定
第三方Newtonsoft.Json序列化
一、JSON序列化两种方式(核心考点)
方式1:原生序列化 DataContractJsonSerializer
需要手动添加程序集引用、代码繁琐、不支持复杂嵌套、开发基本不用。
方式2:第三方 Newtonsoft.Json(JsonConvert)【本课重点】
NuGet第三方开源库、代码极简、支持对象/集合/多层嵌套JSON、企业开发首选。
二、Newtonsoft.Json 安装步骤(必背)
1、右键项目 → 管理 NuGet 程序包
2、切换到【浏览】界面
3、搜索:Newtonsoft.Json
4、点击安装、等待自动引入依赖
5、代码头部引入命名空间:using Newtonsoft.Json;
6、辅助需要的命名空间:
using System.IO;
using System.Collections.Generic;
using System.Windows.Forms;
三、JSON格式与C#实体类映射规则(重中之重)
1、JSON 单个 {} 对象 → 对应 C# 一个实体类
2、JSON 数组 [] → 对应 C# List<T> 泛型集合
3、JSON 多层嵌套 {} → C# 多层嵌套实体类
4、开发技巧:复杂JSON直接复制文本,使用【在线JSON转C#实体类】一键生成对应类,不用手写
5、标准格式:
单个对象JSON:{"name":"张三","age":10}
对象集合JSON:[{"name":"张三"},{"name":"李四"}]
四、复杂嵌套实体类(适配多层JSON)
对应网络小说/漫画JSON多层结构:根类→Hits子对象→TopicMessageList集合
namespace _5使用第三方json序列化
{
//最内层实体:对应每一条漫画/小说数据
public class TopicMessageList
{
//网络图片地址
public string cover_image_url { get; set; }
//作者名称
public string author_name { get; set; }
}
//中层实体:存放集合数组
public class Hits
{
//JSON数组映射为List集合
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; } //嵌套子对象
}
}
五、窗体全局变量 + 构造方法
namespace _5使用第三方json序列化
{
public partial class Form1 : Form
{
//定义全局学生集合,全程保存学生数据
List<Student> list = new List<Student>();
public Form1()
{
InitializeComponent();
//循环批量生成10个学生对象,存入全局集合
for (int i = 0; i < 10; i++)
{
Student s1 = new Student()
{
Name = "哈兰德" + i,
Age = i * 10,
Info = "前锋"
};
list.Add(s1);
}
}
}
代码解析:窗体加载自动创建10条模拟数据,为后续序列化保存做准备。
六、功能一:集合JSON序列化(Button1 写入本地)
功能说明:C# List集合 → JSON字符串 → 写入本地1.txt文件(数据持久化)
private void button1_Click(object sender, EventArgs e)
{
//1.序列化:集合对象转为标准JSON字符串
string data = JsonConvert.SerializeObject(list);
//2.一次性将JSON文本写入本地文件
File.WriteAllText(@"1.txt", data);
}
核心方法 :JsonConvert.SerializeObject(对象/集合) 对象转JSON
优势:File.WriteAllText 无需手动创建文件流、无需释放资源,一键写入。
七、功能二:JSON反序列化(Button2 读取本地)
功能说明:读取本地JSON文本 → 还原为List集合对象 → 数据展示
private void button2_Click(object sender, EventArgs e)
{
//1.读取本地txt中的JSON字符串
string data = File.ReadAllText(@"1.txt");
//2.反序列化:JSON字符串还原为学生集合
List<Student> s1 = JsonConvert.DeserializeObject<List<Student>>(data);
//3.遍历集合,拼接所有学生姓名
string ss = "";
foreach (var item in s1)
{
ss += item.Name;
}
//4.展示到窗体标题
this.Text = ss;
}
核心方法 :JsonConvert.DeserializeObject<指定类型>(字符串) JSON转对象
八、功能三:解析复杂嵌套JSON(Button3)
功能说明:读取多层嵌套漫画JSON、解析文本数据、动态生成图片控件加载网络图片
private void button3_Click(object sender, EventArgs e)
{
//1.读取本地复杂JSON文件,指定默认编码防止乱码
string data = File.ReadAllText(@"漫画.txt", Encoding.Default);
//2.反序列化为根实体类,自动适配多层嵌套结构
XiaoShuoRoot root = JsonConvert.DeserializeObject<XiaoShuoRoot>(data);
//3.遍历嵌套集合,读取作者名称,展示到富文本框
foreach (var item in root.hits.topicMessageList)
{
richTextBox1.Text += item.author_name + "\n";
}
//4.调用自定义方法:动态创建图片控件网格布局,加载网络图片
createPic(panel1, 2, 8, 100, 100, 10, root.hits.topicMessageList);
}
九、核心自定义方法:动态批量创建 PictureBox 控件
作用:在Panel容器中,按【行、列、间距】自动排布图片控件,加载网络图片
/// <summary>
/// 动态创建pictureBox并排布在panel容器中
/// </summary>
/// <param name="p1">承载容器 Panel</param>
/// <param name="rows">网格行数</param>
/// <param name="col">网格列数</param>
/// <param name="width">图片框宽度</param>
/// <param name="height">图片框高度</param>
/// <param name="space">控件之间间距</param>
/// <param name="a">图片地址数据集合</param>
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 //默认背景色
};
//计算每个控件坐标,实现均匀排布
pic.Left = startX + j * (width + space);
pic.Top = startY + i * (height + space);
//绑定网络图片地址,自动在线加载图片
pic.ImageLocation = a[count].cover_image_url;
//将控件添加到Panel容器中显示
p1.Controls.Add(pic);
}
}
}
十、学生实体类
//学生实体类:用于普通对象、集合序列化测试
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public string Info { get; set; }
}
}
}
十一、核心知识点总结(精细)
1、序列化:C#对象/集合 → JSON字符串 持久化保存到本地
2、反序列化:本地JSON字符串 → C#对象/集合 读取使用数据
3、单个对象JSON格式:{"键":"值","键":值}
4、集合对象JSON格式:[{},{},{}] 数组包裹多个对象
5、复杂JSON必须严格按照层级定义嵌套类,层级一一对应
6、Newtonsoft.Json 不需要 Serializable 特性,比二进制、原生JSON更简洁
7、动态控件原理:代码new控件 → 设置属性、坐标 → 添加到容器Controls集合
十一.二 核心方法总结(Newtonsoft)
1、序列化:JsonConvert.SerializeObject(对象/集合) → 对象转JSON字符串
2、反序列化:JsonConvert.DeserializeObject<类型>(字符串) → JSON转对象
3、File.WriteAllText:一键写入文件,无需手动操作文件流
4、File.ReadAllText:一键读取文件文本
十一.三 知识点总结
1、单个对象序列化:{"name":"zs","age":10}
2、集合对象序列化:[{"name":"zs"},{"name":"lisi"}](数组格式)
3、复杂嵌套JSON:严格按照层级定义对应嵌套实体类
4、第三方Json库优势:代码极简、支持嵌套、支持网络图片路径、无需手动释放流
十二、易错点精细总结
1、未安装Newtonsoft.Json库,JsonConvert直接报错
2、实体类层级、字段名和JSON不匹配,导致反序列化数据为NULL
3、行列总数大于集合数据数量,出现索引越界异常
4、读取文件编码不匹配,出现中文乱码(默认使用Encoding.Default)
5、动态控件坐标计算错误,导致控件重叠、排布混乱
6、忘记泛型类型匹配,反序列化转换类型失败