C#中的JSON序列化方法

在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——NET的流行高性能JSON框架,当然也可以使用.NET自带的 System.Text.Json(.NET5)、DataContractJsonSerializerJavaScriptSerializer(不推荐)。

下面是Json.NET、DataContractJsonSerializer、JavaScriptSerializer的性能对比(来自Json.NET官网):

Json.NET的扩展方法类如下(需引用Newtonsoft.Json命名空间):

using Newtonsoft.Json;

/// <summary>
/// Newtonsoft.Json的扩展方法类
/// </summary>
public static class NewtonsoftJsonExtension
{
    /// <summary>
    /// 将Json字符串反序列化为对象实例——Newtonsoft.Json
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="jsonString">Json字符串</param>
    /// <returns>对象实例</returns>
    public static T DeserializeObjectFromJson_NJ<T>(this string jsonString)
    {
        return JsonConvert.DeserializeObject<T>(jsonString);
    }

    /// <summary>
    /// 将对象实例序列化为Json字符串——Newtonsoft.Json
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="obj">对象实例</param>
    /// <returns>Json字符串</returns>
    public static string SerializeObjectToJson_NJ<T>(this T obj)
    {
        return JsonConvert.SerializeObject(obj);
    }
}

DataContractJsonSerializer的扩展方法类如下(需引用System.Runtime.Serialization.Json命名空间):

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

/// <summary>
/// System.Runtime.Serialization.Json扩展方法类([DataContract]和[DataMember]联合使用来标记被序列化的字段)
/// </summary>
public static class SerializationJsonExtension
{
    private static Dictionary<Type, DataContractJsonSerializer> serDic = new Dictionary<Type, DataContractJsonSerializer>();

    private static DataContractJsonSerializer GetSerializer(Type type)
    {
        if (!serDic.ContainsKey(type))
        {
            serDic.Add(type, new DataContractJsonSerializer(type));
        }
        return serDic[type];
    }

    /// <summary>
    /// 将Json字符串反序列化为对象实例——System.Runtime.Serialization.Json([DataContract]和[DataMember]联合使用来标记被序列化的字段)
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="jsonString">Json字符串</param>
    /// <returns>对象实例</returns>
    public static T DeserializeObjectFromJson_SJ<T>(this string jsonString)
    {
        var ser = GetSerializer(typeof(T));

        using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
        {
            T jsonObject = (T)ser.ReadObject(ms);
            return jsonObject;
        }
    }

    /// <summary>
    /// 将对象实例序列化为Json字符串——System.Runtime.Serialization.Json([DataContract]和[DataMember]联合使用来标记被序列化的字段)
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="obj">对象实例</param>
    /// <returns>Json字符串</returns>
    public static string SerializeObjectToJson_SJ<T>(this T obj)
    {
        var ser = GetSerializer(typeof(T));

        using (var ms = new MemoryStream())
        {
            ser.WriteObject(ms, obj);
            ms.Position = 0;
            using (var sr = new StreamReader(ms, Encoding.UTF8))
            {
                return sr.ReadToEnd();
            }
        }
    }
}
posted @   二次元攻城狮  阅读(3292)  评论(0)    收藏  举报
编辑推荐:
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
阅读排行:
· 使用TypeScript开发微信小程序(云开发)-入门篇
· 没几个人需要了解的JDK知识,我却花了3天时间研究
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 管理100个小程序-很难吗
· 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持
  1. 1 烟花易冷 小柔Channel
  2. 2 红颜如霜 江壹纯
  3. 3 不谓侠 小桃Channel
  4. 4 小小恋歌 新坦结衣
  5. 5 神预言 袁娅维TIARAY
不谓侠 - 小桃Channel
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
点击右上角即可分享
微信分享提示
主题色彩