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"}
}
}

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

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

    Json 简介 Json (JavaScript Object Notation) 是一种轻量级的数据交换格式.它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fastj ...

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

    文章来源:http://www.cnblogs.com/dingjie08/archive/2009/11/10/1599929.html 前言    最近帮朋友运营的平台进行了性能调优,效果还不错, ...

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

    转载地址:http://www.cnblogs.com/chenkai/archive/2009/11/07/1597795.html 前言 最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来 ...

  4. [译]:Xamarin.Android平台功能——位置服务

    返回索引目录 原文链接:Location Services. 译文链接:Xamarin.Android平台功能--位置服务 本部分介绍位置服务以及与如何使用位置提供商服务 Location Servi ...

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

    数据库性能最佳实践 当应用须要连接数据库时.那么应用的性能就可能收到数据库性能的影响. 比方当数据库的I/O能力存在限制,或者因缺失了索引而导致运行的SQL语句须要对整张表进行遍历.对于这些问题.只相 ...

  6. 如何使jquery性能最佳

    转自 http://www.cnblogs.com/mo-beifeng/archive/2012/02/02/2336228.html 1. 使用最新版本的jQuery jQuery的版本更新很快, ...

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

    atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria 1. 关键字 1 2. 统计功能框架普通有有些条件选项...一个日期选项..一个日期类型(日,周,月份 ...

  8. ndroid调用平台功能具体技巧分享

    Android操作系统那个可以通过调用手机平台来实现一些特定的功能,诸如网页的显示,邮件的发送等等.那么今天就为大家总结了几个Android调用平台功能的应用技巧,帮助大家增加编程经验. Androi ...

  9. JQuery常用功能的性能优化

    使用最佳选择器 通常比较常用的选择器有以下几个: 1.ID选择器 $("#id") 2.标签选择器 $("td") 3.类选择器 $(".target ...

随机推荐

  1. Docker系列06—基于容器制作镜像并上传到Docker Registry

    本文收录在容器技术学习系列文章总目录 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容器制作镜像:基于dockerfile 制 ...

  2. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(5)- 软件优化

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之软件优化. 前面痞子衡已经初步实现了Jays-PyCOM的串口功能,并且通过了最基本的测试,但目前 ...

  3. Perl系列文章

    0.Perl书籍推荐 Perl书籍下载 密码:kkqx 下面是一些我学习Perl过程中读过完整的或部分章节的觉得好的书. 入门级别1:<Perl语言入门>即小骆驼 入门级别2:<In ...

  4. [转]GitLab-CI与GitLab-Runner

    本文转自:https://www.jianshu.com/p/2b43151fb92e 一.持续集成(Continuous Integration) 要了解GitLab-CI与GitLab Runne ...

  5. WCF消息交换模式之请求-响应模式

    WCF的消息交换模式(MEP)有三种:请求/响应.单向模式和双工模式.WCF的默认MEP是请求/响应模式. 请求/响应模式操作签名代码如下,无需指定模式,默认就是. [OperationContrac ...

  6. windows server 2012/2016 设置多用户远程桌面(转载)

    方案一: 该方案只能满足两个人同时远程. 方案二: https://blog.csdn.net/flyingshuai/article/details/77869279

  7. vue px转换为rem

    前端开发中还原设计图的重要性毋庸置疑,目前来说应用最多的应该也还是使用rem.然而很多人依然还是处于刀耕火种的时代,要么自己去计算rem值,要么依靠编辑器安装插件转换. 而本文的目标就是通过一系列的配 ...

  8. 广州.NET微软技术俱乐部 - 动手实验室

    本文正在写草稿中, 发布时会在群里单独通知

  9. Mac上webstorm与git仓库建立连接

    1.打开Mac终端,输入$ cd ~/.ssh检查.ssh文件是否存在($在终端中存在,不需要自己输入),不存在,进行步骤2 2.如果没有安装ssh文件,输入命令$ssh -v,安装ssh文件,成功时 ...

  10. 设置chrome浏览器背景颜色

    经常看博客,页面背景都是白色的居多,看久了眼睛就不适合了,决定修改chrome浏览器背景颜色,保护下自己的眼睛, 下载chrome 插件Stylish并安装,安装成功后chrome右上角有它的图标,点 ...