You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 19:09:21