你不能使用 JSON.NET / Newtonsoft.JSON 做到那样。
但是,你可以使用 System.Text.Json 代替。
要获取与 JSON.NET 相同的行为,只需将 IncludeFields 和 PropertyNameCaseInsensitive 设置为 true。
public static class JsonExtensions
{
private static readonly System.Text.Json.JsonSerializerOptions _jsonOptions =
new System.Text.Json.JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
IncludeFields = true
}
;
public static string ToJson<T>(this T obj)
{
return System.Text.Json.JsonSerializer.Serialize<T>(obj, _jsonOptions);
}
public static T FromJson<T>(this string json)
{
return System.Text.Json.JsonSerializer.Deserialize<T>(json, _jsonOptions);
}
public static async System.Threading.Tasks.Task ToJsonAsync<T>(this T obj, System.IO.Stream stream)
{
await System.Text.Json.JsonSerializer.SerializeAsync(stream, obj, typeof(T), _jsonOptions);
}
public static async System.Threading.Tasks.Task<T> FromJsonAsync<T>(this System.IO.Stream stream)
{
return await System.Text.Json.JsonSerializer.DeserializeAsync<T>(stream, _jsonOptions);
}
}
就是这样。
另外,如果你想异步序列化为字符串:
public static async System.Threading.Tasks.Task<string> ToJsonAsync<T>(this T obj)
{
string ret = null;
Microsoft.IO.RecyclableMemoryStreamManager streamManager =
new Microsoft.IO.RecyclableMemoryStreamManager();
using (System.IO.MemoryStream ms = streamManager.GetStream())
{
await System.Text.Json.JsonSerializer.SerializeAsync(ms, obj, typeof(T), _jsonOptions);
ms.Position = 0;
using (System.IO.TextReader sr = new System.IO.StreamReader(ms, System.Text.Encoding.UTF8))
{
ret = await sr.ReadToEndAsync();
}
}
return ret;
}
JsonConverter
等),我认为分支不会有太多意义。我想一个专门为异步构建的不同序列化库会更有意义。而异步反序列化将需要推式解析器(事件驱动)而不是阻塞式拉式解析器... - Lucero