f# - F# JsonProvider 类型无法解析十进制
问题描述
为什么不能someJsonType
解析9.433536880271462E-4
为十进制?
自己解析值工作正常let c = decimal "9.433536880271462E-4"
#r "nuget: FSharp.Data, 3.3.3"
type someJsonType = FSharp.Data.JsonProvider<"""
{
"point": 45.5
}
""">
let a = someJsonType.Parse "{ \"point\": 12.5 }"
let b = someJsonType.Parse "{ \"point\": 9.433536880271462E-4 }"
let c = someJsonType.Parse "{ \"point\": 0.0009433536880271462 }"
printfn "%f" a.Point // OK
printfn "%f" b.Point // exception
printfn "%f" c.Point // OK
let d = decimal "9.433536880271462E-4" // OK
例外:
System.Exception: Expecting a Decimal at '/point', got 0.0009433536880271462
at Microsoft.FSharp.Core.PrintfModule.PrintFormatToStringThenFail@1433.Invoke(String message) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\printf.fs:line 1433
at System.Runtime.CompilerServices.RuntimeHelpers.DispatchTailCalls(IntPtr callersRetAddrSlot, IntPtr callTarget, IntPtr retVal)
at Microsoft.FSharp.Core.OptimizedClosures.Invoke@3298-1.Invoke(T2 u, T3 v) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\prim-types.fs:line 3298
at <StartupCode$FSI_0072>.$FSI_0072.main@()
Stopped due to error
解决方案
数据类型被推断为decimal
,但 bfloat
因此是例外。这是一个怪癖,意味着您必须修改示例 json 以确保推断出正确的类型。所以,如果你想推断,float
那么你必须修改你的样本:
#r "nuget: FSharp.Data, 3.3.3"
type someJsonType = FSharp.Data.JsonProvider<"""
{
"point": 9.433536880271462E-4
}
""">
let a = someJsonType.Parse "{ \"point\": 12.5 }"
let b = someJsonType.Parse "{ \"point\": 9.433536880271462E-4 }"
let c = someJsonType.Parse "{ \"point\": 0.0009433536880271462 }"
printfn "%f" a.Point // val a.Point is float with get
printfn "%f" b.Point // OK
printfn "%f" c.Point // OK
如果你想要它,decimal
你可以在将 json 数据加载到本地对象后进行转换。这就是你实际上正在做的事情let d = decimal "9.433536880271462E-4" // OK
(类似地,如果 json 模式旨在提供浮点数或小数,但示例仅具有看似 int 的内容,则会推断出 int,因此您必须再次修改示例以确保推断出正确的类型)
JsonProvider 只能处理样本 json 中现有的内容,因此样本有助于推理的重要性。
(注意:如果来自实时第三方站点,我们并不总是可以控制示例 json,所以我认为某种形式的类型注释可能有助于提供帮助,但据我所知,这还不存在。)
推荐阅读
- swift - 正确使用 CloudKit 容器
- java - getAction() 在 1.16.5 API 中不起作用?(Spigot)
- ios - 使用 Just、KOA/Nodejs 将图像从 iOS 上传到 AWS S3;文件路径和缓冲区无法正确读取
- node.js - 我在 Node.js 上使用 ES6 导入导出并获取模块未找到错误
- flutter - Flutter Image_Picker 不会从图库中选择图像并返回应用程序
- python - python从列表中删除重复元素
- vue.js - Vue 如何从 async/await 函数返回值?
- vue.js - 查找模板引用最近的父 Vue 组件(Vue 3)
- java - FlowLayout 占用垂直空间太大,改变高度
- flutter - Flutter 2.0 如何将提升按钮主题更改为看起来像 RaisedButton