FSharp.Data.JsonProvider.Serializer 1.0.2

dotnet add package FSharp.Data.JsonProvider.Serializer --version 1.0.2                
NuGet\Install-Package FSharp.Data.JsonProvider.Serializer -Version 1.0.2                
此命令旨在在Visual Studio的包管理器控制台中使用,因为它使用NuGet模块的Install-Package版本。
<PackageReference Include="FSharp.Data.JsonProvider.Serializer" Version="1.0.2" />                
对于支持包引用的项目,请将此XML节点复制到项目文件中以引用包。
paket add FSharp.Data.JsonProvider.Serializer --version 1.0.2                
#r "nuget: FSharp.Data.JsonProvider.Serializer, 1.0.2"                
#r指令可以在F#交互式和Polyglot Notebooks中使用。请将其复制到交互式工具或脚本的源代码中以引用包。
// Install FSharp.Data.JsonProvider.Serializer as a Cake Addin
#addin nuget:?package=FSharp.Data.JsonProvider.Serializer&version=1.0.2

// Install FSharp.Data.JsonProvider.Serializer as a Cake Tool
#tool nuget:?package=FSharp.Data.JsonProvider.Serializer&version=1.0.2                

FSharp.Data.JsonProvider.Serializer

NuGet包: https://nuget.net.cn/packages/FSharp.Data.JsonProvider.Serializer/ 此包不是独立包,您仍将使用现有的JsonProvider。

这将提供使用快速System.Text.Json库序列化FSharp.Data.JsonProvider项的实用工具。

动机:序列化速度。通常JSON序列化用于用户查看进度条或在大批量处理中。

当前FSharp.Data使用自定义Json序列化器。

我们需要一个折衷的方案,既有F# JsonProvider的便利性,又有System.Text.Json的速度。

这个方案的想法是替换当前的函数。

从类型提供程序中读取值(反序列化)

当前FSharp.Data.JsonProvider

type MyJsonType = FSharp.Data.JsonProvider<"""{ "model": "..." } """>

let fromJson (response:string) = MyJsonType.Parse response

使用这个库

type MyJsonType = FSharp.Data.JsonProvider<"""{ "model": "..." } """>

let fromJson (response:string) = MyJsonType.Load (Serializer.Deserialize response)

从类型提供程序中保存值(序列化)

当前FSharp.Data.JsonProvider

type MyJson = FSharp.Data.JsonProvider<"""{ "model": "..." } """>

let toJson mymodel = mymodel.JsonValue.ToString()

使用这个库

type MyJson = FSharp.Data.JsonProvider<"""{ "model": "..." } """>

let toJson mymodel = Serializer.Serialize (mymodel.JsonValue)

除此之外,您仍然可以像以前一样继续使用现有的JsonProvider实现。目前它使用System.Text.Json风格的编码引号字符等,但如果您想进一步自定义序列化,可以将JsonReaderOptions和JsonWriterOptions作为参数设置。

初始基准测试

FSharp.Data 6.3,System.Text.Json 8.0

测试用例

  • 将JSON读取到JsonProvider。(序列化)
  • 验证一个属性
  • 将JSON保存回字符串。(反序列化)

使用了小型JSON文件以及Stripe OpenAPI规范文件(+5MB的JSON)进行了测试。

BenchmarkDotNet v0.13.10,Windows 11(10.0.22621.2715/22H2/2022Update/SunValley2)第13代英特尔酷睿i9-13900H,1个CPU,20个逻辑和14个物理核心

.NET 8.0 : .NET 8.0.0 (8.0.23.53103),X64 RyuJIT AVX2
方法 平均值 误差 标准差 Gen0 Gen1 Gen2 分配的
SmallJson_JsonProvider 2.789 μs 0.0314 μs 0.0293 μs 0.4120 - - 5.06 KB
SmallJson_SystemTextJson 1.623 μs 0.0308 μs 0.0288 μs 0.2651 - - 3.27 KB
ListOf1000SmallJsons_JsonProvider 2,849.210 μs 25.9458 μs 20.2568 μs 351.5625 175.7813 58.5938 4224.8 KB
ListOf1000SmallJsons_SystemTextJson 1,424.314 μs 9.3599 μs 8.7553 μs 199.2188 199.2188 199.2188 2469.76 KB
StripeJson_JsonProvider 83,610.123 μs 1,667.5590 μs 3,406.3812 μs 5285.7143 4571.4286 1714.2857 60521.87 KB
StripeJson_SystemTextJsonBytes 42,775.639 μs 822.2020 μs 1,009.7378 μs 2333.3333 2166.6667 750.0000 44305.47 KB
.NET Framework 4.8 : .NET Framework 4.8.1 (4.8.9181.0),X64 RyuJIT VectorSize=256
方法 平均值 误差 标准差 Gen0 Gen1 Gen2 分配的
SmallJson_JsonProvider 6.613 μs 0.0554 μs 0.0518 μs 0.8621 - - 5.32 KB
SmallJson_SystemTextJson 4.832 μs 0.0542 μs 0.0480 μs 0.5493 - - 3.4 KB
ListOf1000SmallJsons_JsonProvider 7,052.777 μs 53.6100 μs 47.5238 μs 695.3125 343.7500 54.6875 4465.7 KB
ListOf1000SmallJsons_SystemTextJson 4,453.736 μs 43.9446 μs 41.1058 μs 390.6250 195.3125 195.3125 2587.36 KB
StripeJson_JsonProvider 107,016.899 μs 2,094.9813 μs 3,500.2432 μs 8200.0000 3800.0000 1400.0000 61612.22 KB
StripeJson_SystemTextJsonBytes 77,002.389 μs 1,531.7106 μs 2,559.1443 μs 4285.7143 2285.7143 1000.0000 45245.97 KB

要运行测试:dotnet run --project tests\Benchmarks\BenchmarkTests.fsproj --configuration=Release --framework=net8.0

API

FSharp.Data使用内部类FSharp.Data.JsonValue来表示JSON域。

从JSON到JsonProvider
  • Deserialize:将字符串转换为FSharp.Data.JsonValue
  • DeserializeWith:字符串和System.Text.Json.JsonReaderOptions转换为FSharp.Data.JsonValue
  • DeserializeBytes:字节数组转换为FSharp.Data.JsonValue
  • DeserializeBytesWith:字节数组和System.Text.Json.JsonReaderOptions转换为FSharp.Data.JsonValue
从JsonProvider到JSON
  • Serialize:FSharp.Data.JsonValue转换为字符串
  • SerializeWith:FSharp.Data.JsonValue和System.Text.Json.JsonWriterOptions转换为字符串
  • SerializeBytes:FSharp.Data.JsonValue转换为字节数组
  • SerializeBytesWith:FSharp.Data.JsonValue和System.Text.Json.JsonWriterOptions转换为字节数组
从JsonProvider到JSON,流式传输

有了流支持,您可以将JSON数据记录逐记录地发送到输出流。

  • SerializeStream:目标流,FSharp.Data.JsonValue
  • SerializeStreamWith:目标流,FSharp.Data.JsonValue和System.Text.Json.JsonWriterOptions

流可能保持与相同的表现特性,但略微减少内存分配,并更快提供部分可消费的结果,如果JSON文件很大且客户端支持流。

.NET 8.0 : .NET 8.0.0 (8.0.23.53103),X64 RyuJIT AVX2

方法 平均值 误差 标准差 Gen0 Gen1 Gen2 分配的
ListOf1000SmallJsons_SystemTextJsonStream 1,525.970 μs 14.0992 μs 13.1884 μs 158.2031 117.1875 78.1250 2100.46 KB
StripeJson_SystemTextJsonStream 47,112.065 μs 805.5929 μs 753.5521 μs 2333.3333 2250.0000 750.0000 31560.25 KB

.NET Framework 4.8 : .NET Framework 4.8.1 (4.8.9181.0),X64 RyuJIT VectorSize=256

方法 平均值 误差 标准差 Gen0 Gen1 Gen2 分配的
ListOf1000SmallJsons_SystemTextJsonStream 4,650.089 μs 34.2087 μs 30.3251 μs 312.5000 156.2500 78.1250 2217.05 KB
StripeJson_SystemTextJsonStream 76,921.557 μs 1,448.2545 μs 1,778.5866 μs 4000.0000 2000.0000 1000.0000 32501.88 KB
产品 兼容和额外的计算目标框架版本。
.NET net5.0 已计算。 net5.0Windows 已计算。 net6.0 已计算。 net6.0Android 已计算。 net6.0iOS 已计算。 net6.0MacCatalyst 已计算。 net6.0macOS 已计算。 net6.0tvOS 已计算。 net6.0Windows 已计算。 net7.0 已计算。 net7.0Android 已计算。 net7.0iOS 已计算。 net7.0MacCatalyst 已计算。 net7.0macOS 已计算。 net7.0tvOS 已计算。 net7.0Windows 已计算。 net8.0 兼容。 net8.0Android 已计算。 net8.0Browser 已计算。 net8.0iOS 已计算。 net8.0MacCatalyst 已计算。 net8.0macOS 已计算。 net8.0tvOS 已计算。 net8.0Windows 已计算。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET标准 netstandard2.0 兼容。 netstandard2.1 兼容。
.NET框架 net461已计算。 net462已计算。 net463已计算。 net47已计算。 net471已计算。 net472已计算。 net48兼容。 net481已计算。
MonoAndroid monoandroid已计算。
MonoMac monomac已计算。
MonoTouch monotouch已计算。
Tizen tizen40已计算。 tizen60已计算。
Xamarin.iOS xamarinios已计算。
Xamarin.Mac xamarinmac已计算。
Xamarin.TVOS xamarintvos已计算。
Xamarin.WatchOS xamarinwatchos已计算。
兼容的目标框架
包含的目标框架(在包中)
详细了解目标框架.NET Standard

NuGet包 (1)

显示依赖FSharp.Data.JsonProvider.Serializer的顶级1个NuGet包

下载
ProveSDK

非官方Prove .NET客户端

GitHub仓库

此包未用于任何流行的GitHub仓库。

版本 下载 上次更新
1.0.2 265 7/15/2024
1.0.1 889 4/1/2024
1.0.0 84 3/29/2024
0.0.4 212 3/13/2024
0.0.3 914 11/29/2023
0.0.2 117 11/23/2023
0.0.1 110 11/22/2023