FSharp.Data.JsonProvider 可选 属性
FSharp.Data.JsonProvider optional property
我正在使用 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
我正在使用 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