迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库。

原文:迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库。

Swifter.Json

这是迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库。

Github : https://github.com/Dogwei/Swifter.Json

之所以说强大,因为这些功能其他框架没有!

(1): 支持深度复杂的对象结构且易于使用。
(2): 用 $ref 表示重复和循环引用的序列化和反序列化。
(3): 目前唯一支持 ref 属性的 JSON 库。
(4): 支持几乎所有您常用的类型!并允许您自定义类型的行为。
(5): 支持 .Net Framework 2.0 +, .Net Core 2.0+, .Net Standard 2.0+, Mono, Xamarin, Unity。

Swifter.Json 实用功能

(1): 缩进美化 Json。
(2): 允许忽略 0 或 null 或 "" 值。
(3): 允许使用 [RWField] 特性定制属性或字段的行为。
(4): 允许设置最大深度来限制内容大小。

Swifter.Json 支持的类型

bool, byte, sbyte, char, shoft, ushoft, int, uint, long, ulong,
float, double, decimal, string, enum, DateTime, DateTimeOffset,
Guid, TimeSpan, DBNull, Nullable<T>, Version, Type,
Array, Multidimensional-Arrays, IList, IList<T>, ICollection,
ICollection<T>, IDictionary, IDictionary<TKey, TValue>,
IEnumerable, IEnumerable<T>, DataTable, DbDataReader
...
其余类型将会被当作 Object,以 属性键/属性值 的形式映射。

Swifter.Json 安全吗?

每次发布之前我都会观察至少一个月,期间会进行大量的测试,并且在实际项目中使用未发布的版本
来确保发布版本的稳定性。但即使这样,我也无法保证它一定安全。所以,如果您发现了
Bug 或某些不合理的地方请及时联系我 QQ:1287905882,邮箱 1287905882@qq.com。

性能测试对比

* 图表中的颜色随所用时间从 绿色 渐变为 黄色。当用时超过 3 倍时将以亮黄色显示。
	Timeout: 表示用时过久。
	Exception: 表示发生了异常。
	Error: 未发生异常,但结果不正确。
* Swifter.Json 第一次执行需要额外的时间来生成一个 “操作类” (FastObjectRW<T>),
	则会越来越快。所以如果您的程序需要长期运行,那么 Swifter.Json 是您优的选择。
	如果您的程序不适用这种模式,那么下面介绍的 XObjectRW<T> 也许适合您。

Swifter.Json 性能为何如此优异?

(1): 最优秀的整型和浮点型 ToString 和 Parse 方法实现。
(2): Emit 实现的高性能对象映射工具。
(3): 本地内存分配!拒绝 .Net 托管二次内存。
(4): 使用线程缓存,让您的程序运行越久速度越快。
(5): 内部全指针运算,相当于使用了 .Net Core 新技术 Span<T>!

测试时其他库所使用的版本

如何安装 Swifter.Json ?

Nuget> Install-Package Swifter.Json -Version 1.1.2

代码示例

(1): 简单使用

    public class Demo
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public static void Main()
        {
            var json = JsonFormatter.SerializeObject(new { Id = 1, Name = "Dogwei" });
            var dictionary = JsonFormatter.DeserializeObject<Dictionary<string, object>>(json);
            var obj = JsonFormatter.DeserializeObject<Demo>(json);
        }
    }

(2): 处理重复引用

    public class Demo
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public Demo Instance { get; set; }

        public static void Main()
        {
            var jsonFormatter = new JsonFormatter(JsonFormatterOptions.MultiReferencingReference);

            var obj = new Demo() { Id = 1, Name = "Dogwei" };

            obj.Instance = obj;

            var json = jsonFormatter.Serialize(obj);

            var deser = jsonFormatter.Deserialize<Demo>(json);

            Console.WriteLine(json); // {"Id":1,"Instance":{"$ref":"#"},"Name":"Dogwei"}

            Console.WriteLine(deser.Instance == deser); // True
        }
    }

(3): RWField 特性

    public class Demo
    {
        [RWField("First Name")]
        public string Name { get; set; }

        [RWField]
        public int Age;

        [RWField(Access = RWFieldAccess.Ignore)]
        public int Sex { get; set; }
        [RWField(Order = 1)]
        public int Id { get; set; }

        public static void Main()
        {
            var obj = new Demo() { Id = 1, Name = "Dogwei", Age = 22, Sex = 1 };

            var json = JsonFormatter.SerializeObject(obj);

            Console.WriteLine(json); // {"Id":1,"Age":22,"First Name":"Dogwei"}
        }
    }

(4): 设置日期格式

    public class Demo
    {
        public static void Main()
        {
            var jsonFormatter = new JsonFormatter();

            jsonFormatter.SetDateTimeFormat("yyyy-MM-dd HH:mm:ss");

            var json = jsonFormatter.Serialize(DateTime.Now);

            Console.WriteLine(json); // "2019-02-13 11:03:46"
        }
    }

(5): 自定义类型的行为

    public class Demo
    {
        public string Name { get; set; }

        public int Sex { get; set; }

        public bool IsMan { get => Sex == 1; }

        public unsafe static void Main()
        {
            var jsonFormatter = new JsonFormatter();

            jsonFormatter.SetValueInterface<bool>(new MyBooleanInterface());

            var obj = new Demo() { Name = "Dogwei", Sex = 1 };

            var json = jsonFormatter.Serialize(obj);

            Console.WriteLine(json); // {"IsMan":"yes","Name":"Dogwei","Sex":1}
        }
    }

    public class MyBooleanInterface : IValueInterface<bool>
    {
        public bool ReadValue(IValueReader valueReader)
        {
            var value = valueReader.ReadString();

            switch (value)
            {
                case "yes":
                case "true":
                    return true;
                case "no":
                case "false":
                    return false;
                default:
                    return Convert.ToBoolean(value);
            }
        }

        public void WriteValue(IValueWriter valueWriter, bool value)
        {
            valueWriter.WriteString(value ? "yes" : "no");
        }
    }

(6): 设置缓存大小

    public class Demo
    {
        public static void Main()
        {
            HGlobalCache.MaxSize = 1024 * 500; // 500KB

            var json = JsonFormatter.SerializeObject(new { MaxJsonLength = 256000 });
        }
    }

(7): 序列化超大文件

    public class Demo
    {
        public static void Main()
        {
            var bigObject = new BigObject();

            using (FileStream fileStream = new FileStream("/BigObject.json", FileMode.Create, FileAccess.ReadWrite))
            {
                using (StreamWriter streamWriter = new StreamWriter(fileStream))
                {
                    JsonFormatter.SerializeObject(bigObject, streamWriter);
                }
            }
        }
    }

(8): 使用适用小型应用程序的 XObjectRW<T>

    public class Demo
    {
        public static void Main()
        {
            // Default (FastObjectInterface)    : 初始化开销较大,内存较大,性能优异。
            // XObjectInterface                 : 初始化开销小,内存占用少,性能也不错。

            ValueInterface.DefaultObjectInterfaceType = typeof(XObjectInterface<>);

            var json = JsonFormatter.SerializeObject(new { Id = 1, Name = "Dogwei" });

            Console.WriteLine(json); // {"Id":1,"Name":"Dogwei"}
        }
    }

原文地址:https://www.cnblogs.com/lonelyxmas/p/10373084.html

时间: 2024-10-09 15:17:42

迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库。的相关文章

Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】

Json 简介 Json (JavaScript Object Notation) 是一种轻量级的数据交换格式.它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fastjson(java),腾讯的 rapidjson(c++) 等.但 .Net 却没有得到大厂的青睐,在 Swifter.Json 之前 .Net 的 Json 解析库都不完美. Swifter.Json 简介 Swifter.Json 是 .Net 平台上一个功能强大,简单易用,稳定及高性能的 Jso

Swifter.Json -- 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具。

Swifter.Json Github Wiki 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具. Swifter.Json 已经经过了大量测试和线上项目中运行许久来确保它的稳定性. 特性 1: 支持 .Net 上绝大多是的数据类型,且轻松扩展:包括但不限于:实体,字典,集合,迭代器,数据读取器和表格. 2: 支持 .Net 我已知的大多数平台,包括但不限于:.Net Framework 2.0+, .Net Core 2.0+, .Net St

[网站性能2]Asp.net平台下网站性能调优的实战方案

文章来源:http://www.cnblogs.com/dingjie08/archive/2009/11/10/1599929.html 前言    最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来一起交流一下.如果本文中有您觉的错误的,或者不明白的,请加QQ群:4656272,欢迎指正和一起探讨.(ps:鄙人文笔很差,看官请多担待) 背景    朋友的平台网站属于垂直型的资讯社区网站,原先是用ASP.NET 1.0开发的,后来升级到ASP.NET 2.0,数据库为SQL SERVE

如何使jquery性能最佳

转自 http://www.cnblogs.com/mo-beifeng/archive/2012/02/02/2336228.html 1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的jQuery选择语句: $(‘.elem’) $(‘.elem’, context) context.find(‘.elem’) 我们用1.4.2.1.4.4.1.

消息推送 - 微信公众平台订阅用户获取最佳途径

微信公众平台统计功能中用户增长页增加增长来源统计后,我们可以知道用户获取途径大致有①搜索公众号名称②搜索微信号③图文消息右上角菜单④名片分享⑤其他,老贼也在第一时间为我们总结了目前微信公众平台用户获取最佳途径还是通过消息推送,另一个就是互推. 首先是正常运营状态,即指不做任何推广,单纯靠消息推送获取新用户,在这种条件下获取用户最多的途径竟然是……其他!而在这个里面据我观察主要是通过图文消息标题下蓝字关注进来的,也就是说一方面用户通过这种方式点击关注公众号的习惯已经养成,另一方面很多公众账号在头图

[Java Performance] 数据库性能最佳实践 - JPA和读写优化

数据库性能最佳实践 当应用需要连接数据库时,那么应用的性能就可能收到数据库性能的影响.比如当数据库的I/O能力存在限制,或者因缺失了索引而导致执行的SQL语句需要对整张表进行遍历.对于这些问题,仅仅对应用代码进行优化可能是不够,还需要了解数据库的知识和特点. 示例数据库 该数据库表示了128只股票在1年内(261个工作日)的股价信息. 其中有两张表:STOCKPRICE和STOCKOPTIONPRICE. STOCKPRICE中使用股票代码作为主键,另外还有日期字段.它有33408条记录(128

Asp.net平台下网站性能调优的实战方案(转)

转载地址:http://www.cnblogs.com/chenkai/archive/2009/11/07/1597795.html 前言 最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来一起交流一下.如果本文中有您觉的错误的,或者不明白的,请加QQ群:4656272,欢迎指正和一起探讨.(ps:鄙人文笔很差,看官请多担待) 背景朋友的平台网站属于垂直型的资讯社区网站,原先是用ASP.NET 1.0开发的,后来升级到ASP.NET 2.0,数据库为SQL SERVER 2000,操作

atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria

atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria 1. 关键字 1 2. 统计功能框架普通有有些条件选项...一个日期选项..一个日期类型(日,周,月份,年等) 1 3. 元数据的位置,不需要绑定class 1 4. 设置聚合字段... @reduce(" sum(timLen) "),@reduce(" Avg(timLen) ") 2 5. 设置groupby  字段  @GroupBy 2 6. 设置groupb

微信公众平台功能开发(生成带参数的二维码)

为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. 目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--100000).两种二维码分别适用于帐号绑定.用户来源统计等场景. 用户扫描带场景值二维码时,可能推送以下两种事件: 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事