迄今爲止 .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"}
        }
    }
相關文章
相關標籤/搜索