C# JSON 序列化(原生 + 第三方Newtonsoft) 的使用

 更新时间:2026年07月05日 10:05:55   作者:影寂ldy  
本文主要介绍了本文对比原生DataContractJsonSerializer与第三方Newtonsoft.Json,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

到此这篇关于C# JSON 序列化(原生 + 第三方Newtonsoft) 的使用的文章就介绍到这了,更多相关C# JSON 序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中lock死锁实例教程

    C#中lock死锁实例教程

    这篇文章主要介绍了C#中lock死锁的用法,对于共享资源的访问及C#程序设计的安全性而言,有着非常重要的意义!需要的朋友可以参考下
    2014-08-08
  • C#使用Spire.XLS for .NET将Excel转换为SVG图片

    C#使用Spire.XLS for .NET将Excel转换为SVG图片

    在C#开发中,C# Excel转换为SVG的需求日益增长,尤其Web应用中Excel矢量预览已成为痛点解决关键,本文客观分享实现路径与代码,帮助C#开发者快速集成,提升项目效率,需要的朋友可以参考下
    2026-03-03
  • 详解C#调用matlab生成的dll库

    详解C#调用matlab生成的dll库

    这篇文章主要介绍了C#调用matlab生成的dll库,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • c#如何用好垃圾回收机制GC

    c#如何用好垃圾回收机制GC

    这篇文章主要介绍了c# 如何用好垃圾回收机制GC,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-08-08
  • C#操作Word中水印添加和移除的完整指南

    C#操作Word中水印添加和移除的完整指南

    在软件系统开发过程中,文档处理功能往往是企业级应用的重要组成部分,本文将详细介绍如何利用 Spire.Doc for .NET 组件,通过 C# 代码实现 Word 文档中文本水印的添加、图片水印的添加以及已有水印的移除操作,有需要的小伙伴可以了解下
    2026-05-05
  • C#实现任务栏通知窗口

    C#实现任务栏通知窗口

    作为程序员在享受的同时我们也不禁要问:这到底是怎么实现的呢?本文就利用Visual Studio .Net C# 2005以及.Net框架绘图技术来实现这种任务栏通知窗口。
    2015-10-10
  • c#线程同步使用详解示例

    c#线程同步使用详解示例

    这篇文章主要介绍了c#线程同步使用方法,介绍几种常用的C#进行线程同步的方式,需要的朋友可以参考下
    2014-02-02
  • C#使用System.Net库实现自动发送邮件功能

    C#使用System.Net库实现自动发送邮件功能

    在C#编程环境中,实现邮件发送功能是一项常见的需求,无论是Web应用程序还是Windows窗体应用程序,下面小编就来为大家讲讲如何使用System.Net库实现这一功能吧
    2025-03-03
  • C#实现自定义圆角按钮的方法

    C#实现自定义圆角按钮的方法

    Winform中自带的button没有圆角属性,所以我们继承Button类,重写OnPaint事件来绘制圆角按钮。下面通过实例代码给大家介绍下C#实现自定义圆角按钮的方法,需要的朋友参考下吧
    2021-11-11
  • C# 使用Microsoft Edge WebView2的相关总结

    C# 使用Microsoft Edge WebView2的相关总结

    这篇文章主要介绍了C# 使用Microsoft Edge WebView2的相关总结,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02

最新评论