歡迎光臨
每天分享高質量文章

.NET平臺功能最強大,效能最佳的JSON庫

作者:陳鑫偉

連結:https://www.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, Version, Type,

Array, Multidimensional-Arrays, IList, IList, ICollection,

ICollection, IDictionary, IDictionary,

IEnumerable, IEnumerable, DataTable, DbDataReader

...

其餘型別將會被當作 Object,以 屬性鍵/屬性值 的形式對映。

 

Swifter.Json 安全嗎?

 

每次釋出之前我都會觀察至少一個月,期間會進行大量的測試,並且在實際專案中使用未釋出的版本。

來確保釋出版本的穩定性。但即使這樣,我也無法保證它一定安全。所以,如果您發現了。

Bug 或某些不合理的地方請及時聯絡我 QQ:1287905882,郵箱 1287905882@qq.com。

 

效能測試對比

 

 

圖表中的顏色隨所用時間從 綠色 漸變為 黃色。當用時超過 3 倍時將以亮黃色顯示。

 

  • Timeout:表示用時過久。

  • Exception:表示發生了異常。

  • Error:未發生異常,但結果不正確。

 

Swifter.Json 第一次執行需要額外的時間來生成一個 “操作類” (FastObjectRW),

 

  • 後續會越來越快。所以如果您的程式需要長期執行,那麼 Swifter.Json 是您優的選擇。

  • 如果您的程式不適用這種樣式,那麼下麵介紹的 XObjectRW 也許適合您。

 

Swifter.Json 效能為何如此優異?

 

  • 最優秀的整型和浮點型 ToString 和 Parse 方法實現。

     

  • Emit 實現的高效能物件對映工具。

  • 本地記憶體分配!拒絕 .Net 託管二次記憶體。

  • 使用執行緒快取,讓您的程式執行越久速度越快。

  • 內部全指標運算,相當於使用了 .Net Core 新技術 Span。

測試時其他庫所使用的版本

 

 

如何安裝 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.DeserializeObjectstring, object>>(json);
        var obj = JsonFormatter.DeserializeObject(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(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

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

    贊(0)

    分享創造快樂