FSharp.Data.JsonProvider可选属性



我正在使用FSharp.Data.TypeProvider,但我有一个可选的属性,但它并没有呈现为这样。

我有这个例子JSON:

[
{
"error": {
"message": "Error validating access token: Session has expired on Friday, 24-Jul-20 16:00:00 PDT. The current time is Friday, 24-Jul-20 16:06:14 PDT.",
"type": "OAuthException",
"code": 190,
"error_subcode": 463,
"fbtrace_id": "A0yQG8l8ggauD5PMbYSnEyA"
}
},
{
"error": {
"message": "Error validating access token: Session has expired on Friday, 24-Jul-20 16:00:00 PDT. The current time is Friday, 24-Jul-20 16:06:14 PDT.",
"type": "OAuthException",
"code": 190,
"error_subcode": 463,
"fbtrace_id": "A0yQG8l8ggauD5PMbYSnEyA"
}
},
{
"data": [
{
"id": "17841511906082530"
}
]
}
]

字段error被读取为Optional<Error>,而字段dataDatum [],它应该是Optional<Data>,这个错误似乎与数组有关,如果我将data的值更改为另一种类型,比如数字,它可以正确地推断类型。

也许是某些缓存出错了?如何重置TypeProvider缓存?

还是我做错了什么?

github项目中也报告了此问题:https://github.com/fsharp/FSharp.Data/issues/1322

这是预期的行为。

在JSON字符串中,data是一个数组,空数组表示None,因此字段Data被读取为数组。这是有道理的。

该阵列的每个元素属于类型Datum这一事实也有意义,因为DatumData的单一形式(复数形式(。事实上,如果您将data重命名为dogs,您将看到它被读取为Dog []

更新:我认为我们不能告诉类型提供者将字段data推断为Option<Datum[]>。要检查它是否真的是一个空数组,我们需要检查JsonValue字段:

match node.JsonValue with
| JsonValue.Record [|("data", _)|] ->
// yep, we have field data here
| _ ->
// nope, field data is missed

最新更新