C#中JSON序列化和反序列化的三种主流方法
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;
}完成判断
- 执行上述代码后,控制台应正确输出序列化后的JSON字符串格式文本。
- 反序列化操作完成后,验证打印出的对象属性值(如
Name,Price)是否与原始JSON内容一致。 - 使用
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#数据处理的技术资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









