C#中JSON序列化和反序列化的三种主流方法

码头散步
码头散步
发布时间:2026-10-16| 6人浏览过
原创

C#处理JSON数据通常涉及序列化(对象转JSON)与反序列化(JSON转对象)。本文对比介绍了使用系统自带的 DataContractJsonSerializer、已标记过时的 JavaScriptSerializer 以及广泛使用的第三方库 Newtonsoft.Json 的三种实现方式,包含完整的工具类代码与测试用例。

结果或目标

在C#开发中,经常需要将内存中的复杂对象转换为JSON格式的字符串以便存储或网络传输(序列化),反之则需要将接收到的JSON字符串还原为强类型的对象集合(反序列化)。

准备条件

  • 基础依赖:若使用系统原生的 DataContractJsonSerializer,需引入 System.Runtime.Serialization 命名空间。
  • 第三方库:若使用 Newtonsoft.Json(即Json.NET),需要通过NuGet安装该组件。
  • 数据模型:需要定义与JSON结构匹配的C#类,且属性必须包含 get 和 set 访问器。

真实操作顺序

第1步:定义数据模型

目的:建立JSON字段与C#属性的映射关系,是进行序列化和反序列化的前提。
入口:新建一个普通类。
动作:定义具有 get;set; 的属性。以下示例定义了包含名称和价格的对象:

public class Obj
{
    public string Name { get; set; }
    public double Price { get; set; }
}

第2步:使用 DataContractJsonSerializer 进行转换

目的:利用 .NET Framework 内置类库,不依赖第三方包完成基础的JSON转换。
核心类:DataContractJsonSerializer。
重要参数:需指定目标类型 typeof(T) 并使用 MemoryStream 作为传输媒介。
工具类实现:

using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;

public static class Serialization
{
    // 反序列化:JSON字符串 → 对象
    public static T JsonToObject<T>(string jsonText)
    {
        var serializer = new DataContractJsonSerializer(typeof(T));
        using (var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonText)))
        {
            return (T)serializer.ReadObject(memoryStream);
        }
    }

    // 序列化:对象 → JSON字符串
    public static string ObjectToJSON<T>(T obj)
    {
        var serializer = new DataContractJsonSerializer(typeof(T));
        string result = string.Empty;
        using (var memoryStream = new MemoryStream())
        {
            serializer.WriteObject(memoryStream, obj);
            memoryStream.Position = 0;
            using (var streamReader = new StreamReader(memoryStream))
            {
                result = streamReader.ReadToEnd();
            }
        }
        return result;
    }
}

第3步:使用 JavaScriptSerializer (适用于旧版项目)

注意:JavaScriptSerializer 自 .NET Core 起已被移除,仅限在老版本 .NET Framework 中使用,新项目不建议采用。
入口:System.Web.Script.Serialization 命名空间。
动作:调用 Deserialize 和 Serialize 方法。

using System.Web.Script.Serialization;
using System.Collections.Generic;

public static void JSONStringToList()
{
    JavaScriptSerializer Serializer = new JavaScriptSerializer();

    // 单对象反序列化
    string JsonStr = "{\"Name\":\"苹果\",\"Price\":5.5}";
    Obj obj = Serializer.Deserialize<Obj>(JsonStr);
    Console.WriteLine(obj.Name + ":" + obj.Price);

    // 数组对象反序列化
    string JsonStrs = "[{\"Name\":\"苹果\",\"Price\":5.5},{\"Name\":\"橘子\",\"Price\":2.5}]";
    List<Obj> objs = Serializer.Deserialize<List<Obj>>(JsonStrs);

    foreach (var item in objs)
    {
        Console.WriteLine(item.Name + ":" + item.Price);
    }
}

第4步:使用 Newtonsoft.Json 解析动态JSON

目的:当JSON结构不确定或需要灵活查询节点时使用。
核心类:JObject, JsonConvert。
动作:解析JSON字符串并提取特定字段。

using Newtonsoft.Json.Linq;

public static JObject StrToJson(string jsonText)
{
    // 示例输入:{"shenzheng":"深圳","beijing":"北京","shanghai":[{"zj1":"zj11","zj2":"zj22"},"zjs"]}
    JObject jo = JObject.Parse(jsonText);

    // 获取标量值
    string zone = jo["shenzheng"].ToString(); // 输出: "深圳"

    // 获取数组或嵌套对象
    string zoneEn = jo["shanghai"].ToString(); 
    string zj1 = jo["shanghai"][1].ToString(); // 输出: "zjs"

    return jo;
}

完成判断

  1. 执行上述代码后,控制台应正确输出序列化后的JSON字符串格式文本。
  2. 反序列化操作完成后,验证打印出的对象属性值(如 Name, Price)是否与原始JSON内容一致。
  3. 使用 JObject 解析时,确保索引和下划线命名的路径能准确获取到预期值,无空引用异常。

原文有依据的排错

  • MemoryStream未释放:在使用 DataContractJsonSerializer 时,务必确保 MemoryStream 被正确关闭或在 using 语句中管理,避免内存泄漏。
  • JSON语法错误:使用 JObject.Parse 或 JavaScriptSerializer 时,输入的字符串必须符合严格的标准JSON格式(双引号包裹键名等),否则可能抛出格式异常。
  • 兼容性警告JavaScriptSerializer 仅在部分旧的 .NET Framework 版本中可用,迁移至 .NET Core / .NET 5+ 时将无法编译,请切换至 System.Text.Json 或 Newtonsoft.Json。

简要总结

针对C#中的JSON处理,如果是简单的全量结构化对象转换,推荐使用系统自带的 DataContractJsonSerializer 以保持零依赖;对于复杂查询或非标数据结构,Newtonsoft.Json 提供了更强大的灵活性;而 JavaScriptSerializer 仅保留用于维护遗留系统。以上就是C#对Json进行序列化和反序列化的详细内容,更多关于C#数据处理的技术资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。