LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

.NET平台功能最强大,性能最佳的JSON库

admin
2024年10月29日 13:54 本文热度 146

转自:陈鑫伟

cnblogs.com/Dogwei/p/10372436.html

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 性能为何如此优异?

  • 最优秀的整型和浮点型 ToString 和 Parse 方法实现。

  • Emit 实现的高性能对象映射工具。

  • 本地内存分配!拒绝 .Net 托管二次内存。

  • 使用线程缓存,让您的程序运行越久速度越快。

  • 内部全指针运算,相当于使用了 .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"}
   }
}

该文章在 2024/10/30 12:24:24 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved