作者:陳鑫偉
連結: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"}
}
}