• 迄今为止 .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"}
            }
        }
    
  • 相关阅读:
    select、poll和epoll
    Linux 常用命令之文件和目录
    SmartPlant Review 帮助文档机翻做培训手册
    SmartPlant Foundation 基础教程 3.4 菜单栏
    SmartPlant Foundation 基础教程 3.3 标题栏
    SmartPlant Foundation 基础教程 3.2 界面布局
    SmartPlant Foundation 基础教程 3.1 DTC登陆界面
    SmartPlant Foundation 基础教程 1.4 SPF架构
    SmartPlant Foundation 基础教程 1.3 SPF其他功能
    SmartPlant Foundation 基础教程 1.2 SPF集成设计功能
  • 原文地址:https://www.cnblogs.com/Dogwei/p/10372436.html
Copyright © 2020-2023  润新知