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>同时字段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