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. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU特性介绍(3)- 命名规则

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的命名规则. 打开任何一款i.MX RT系列芯片的Data Sheet均可找到如下命名规则表,以i.MX ...

  2. js内存深入学习(二)

    继上一篇文章 js内存深入学习(一) 3. 内存泄漏 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存.否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃. 对于不再用到的内 ...

  3. 分享:Java 开发精美艺术二维码

    博客地址:https://ainyi.com/58 Java 开发精美艺术二维码 看到网络上各种各样的二维码层出不穷,好像很炫酷的样子,一时兴起,我也要制作这种炫酷二维码效果 例如: 根据以往例子 根 ...

  4. JS输入框去除负号(限定输入正数)

    onkeyup="(this.v=function(){this.value=this.value.replace(/\-/g,\'\');}).call(this)" 示例: & ...

  5. Java开发笔记(五十四)内部类和嵌套类

    通常情况下,一个Java代码文件只定义一个类,即使两个类是父类与子类的关系,也要把它们拆成两个代码文件分别定义.可是有些事物相互之间密切联系,又不同于父子类的继承关系,比如一棵树会开很多花朵,这些花儿 ...

  6. Spring Cloud Alibaba Nacos 入门

    概览 阿里巴巴在2018年7月份发布Nacos, Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台.并表示在6-8个月完成到生产可用的0.8版本,目前版本是0.9版本. Na ...

  7. 深入浅出Java类加载过程

    学习笔记二之Java虚拟机中类加载的过程 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化. 1.    加载 加载,是指Java虚拟机查找字 ...

  8. CSS3 calc实现滚动条出现页面不跳动

    什么是calc()? calc()从字面我们可以把他理解为一个函数function.其实calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度.比如说,你可 ...

  9. JS table内容转成二维数组,支持colspan和rowspan

    思路:1.先初始化colspan的数据到数组2.根据rowspan和colspan计算th和td的矩阵二次填充数组 说明:需要引用到第三方库jQuery,table中的th和td行和列跨度必须正确 & ...

  10. 腾讯云centos7远程连接配置

    1.申请腾讯云 注册腾讯云账号,申请一个centos7的服务器,1G内存,1核处理器,1M网速. 对于这种入门级配置,建议还是别用windows server了,不然不装任何东西,光运行系统就需要60 ...