C#不使用外部库或NuGet包实现JSON序列化反序列化及报错解决
C# 无外部依赖实现JSON序列化/反序列化方案
.NET 从Framework 4.5版本开始就内置了JSON处理能力,不需要引入任何第三方类库或NuGet包即可实现序列化与反序列化,你提供的DataContractJsonSerializer实现运行报错,核心是编码使用错误、缺少必要配置、实体类未标记序列化特性三个原因。
现有代码的问题点
- 序列化方法使用
Encoding.Default获取字符串:该编码为操作系统当前区域的默认编码,不同设备环境编码规则不统一,而JSON标准规范要求使用UTF-8编码,编码不匹配会直接导致乱码、反序列化解析失败。 - 反序列化方法冗余创建
StreamWriter写入内容,额外增加了编码不一致的风险,完全可以直接通过UTF8编码将字符串转为内存流读取。 - 未配置序列化规则,默认序列化DateTime时会生成
/Date(时间戳)/格式的非标准JSON值,且未给实体类标记序列化契约特性时,会出现序列化字段丢失、反序列化抛异常的问题。
修复后的可运行实现
首先引入必须的内置命名空间,不需要安装任何额外包:
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; using System.Text;
工具类实现代码:
public static class NativeJsonHelper { private static readonly DataContractJsonSerializerSettings _jsonSettings = new DataContractJsonSerializerSettings { // 统一DateTime为ISO 8601标准格式,兼容绝大多数JSON解析场景 DateTimeFormat = new DateTimeFormat("yyyy-MM-ddTHH:mm:ss.fffZ"), // 字典序列化使用简单键值对格式,避免生成复杂的Key/Value嵌套结构 UseSimpleDictionaryFormat = true }; /// <summary> /// 将对象序列化为JSON字符串 /// </summary> public static string Serialize<T>(T item) { if (item == null) { return string.Empty; } using var ms = new MemoryStream(); var serializer = new DataContractJsonSerializer(typeof(T), _jsonSettings); serializer.WriteObject(ms, item); return Encoding.UTF8.GetString(ms.ToArray()); } /// <summary> /// 将JSON字符串反序列化为指定类型对象 /// </summary> public static T Deserialize<T>(string jsonBody) { if (string.IsNullOrWhiteSpace(jsonBody)) { return default; } using var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonBody)); var serializer = new DataContractJsonSerializer(typeof(T), _jsonSettings); return (T)serializer.ReadObject(ms); } }
使用要求
- 所有需要序列化/反序列化的实体类,必须添加
[DataContract]特性标记,参与序列化的属性需要添加[DataMember]特性,未标记的属性不会被JSON序列化处理。可以通过DataMember的Name属性指定JSON字段对应的映射名,示例:
[DataContract] public class Product { [DataMember(Name = "productId")] public long Id { get; set; } [DataMember(Name = "productName")] public string Name { get; set; } [DataMember(Name = "price")] public decimal Price { get; set; } [DataMember(Name = "publishTime")] public DateTime PublishTime { get; set; } }
- 如果你使用的是.NET Core 3.0、.NET 5及以上版本,内置还提供了更轻量高性能的
System.Text.Json组件,同样不需要第三方依赖,API更简洁,日常使用优先选择该方案:
using System.Text.Json; // 序列化 string jsonStr = JsonSerializer.Serialize(yourObject); // 反序列化 Product product = JsonSerializer.Deserialize<Product>(jsonStr);
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

