一、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装,一行代码转阴阳;

嵌套数据实体配,动态控件排版强。

觉得上面的内容有用吗?快来点个赞吧!

点赞() 我要打赏

温馨提示 : 本站内容来自会员投稿以及互联网,所有源码及教程均为作者总结编辑,请大家在使用过程中提前做好备份,以免发生无法预知的错误,源码类教程请勿直接用于生产环境!

 可能感兴趣的文章