我正在使用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>
,而字段data
是Datum []
,它应该是Optional<Data>
,这个错误似乎与数组有关,如果我将data
的值更改为另一种类型,比如数字,它可以正确地推断类型。
也许是某些缓存出错了?如何重置TypeProvider缓存?
还是我做错了什么?
github项目中也报告了此问题:https://github.com/fsharp/FSharp.Data/issues/1322
这是预期的行为。
在JSON字符串中,data
是一个数组,空数组表示None
,因此字段Data
被读取为数组。这是有道理的。
该阵列的每个元素属于类型Datum
这一事实也有意义,因为Datum
是Data
的单一形式(复数形式(。事实上,如果您将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