C#JSON序列化(DataContractJsonSerializer)+第三方Newtonsoft.Json序列化

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、二进制序列化需要 SerializableJSON不需要

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、忘记泛型类型匹配,反序列化转换类型失败