javascript
.NET平台功能最强大,性能最佳的JSON库
轉自:陳鑫偉
cnblogs.com/Dogwei/p/10372436.html
Swifter.Json
這是迄今為止 .Net 平臺功能最強大,性能最佳的 JSON 序列化和反序列化庫。
Github : https://github.com/Dogwei/Swifter.Json
之所以說強大,因為這些功能其他框架沒有。
支持深度復雜的對象結構且易于使用。
用 $ref 表示重復和循環引用的序列化和反序列化。
目前唯一支持 ref 屬性的 JSON 庫。?
支持幾乎所有您常用的類型!并允許您自定義類型的行為。
支持 .Net Framework 2.0 +, .Net Core 2.0+, .Net Standard 2.0+, Mono, Xamarin, Unity。
Swifter.Json 實用功能
縮進美化 Json。
允許忽略 0 或 null 或 "" 值。
允許使用 [RWField] 特性定制屬性或字段的行為。
允許設置最大深度來限制內容大小。
Swifter.Json 支持的類型
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 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 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 特性
{
? ?[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 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 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 static void Main()
? ?{
? ? ? ?HGlobalCache.MaxSize = 1024 * 500; // 500KB
? ? ? ?var json = JsonFormatter.SerializeObject(new { MaxJsonLength = 256000 });
? ?}
}
7、序列化超大文件
{
? ?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 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库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 在数组末尾添加元素_Java快
- 下一篇: ttf能改成gfont吗_请问如何修改t