重命名 FSharp.Data JsonProvider 的类型

Renaming type for FSharp.Data JsonProvider

我有一个看起来像这样的 JSON:

{
    ...
    "names": [
        {
            "value": "Name",
            "language": "en"
        }
    ],
    "descriptions": [
        {
            "value": "Sample description",
            "language" "en"
        }
    ],
    ...
}

当使用 FSharp.Data 库中的 JsonProvider 时,它将两个字段映射为同一类型 MyJsonProvider.Name。使用代码时,这有点令人困惑。有什么办法可以将类型重命名为 MyJsonProvider.NameOrDescription?我读到 CsvProvider 是可行的,但输入

JsonProvider<"./Resources/sample.json", Schema="Name->NameOrDescription">

导致错误。

另外,是否可以定义Description字段实际上是一个Option<MyJsonProvider.NameOrDescription>?或者我只需要定义 JSON 两次,一次使用所有可能的值,第二次只使用强制值?

[
    {
        ...
        "names": [
            {
                "value": "Name",
                "language": "en"
            }
        ],
        "descriptions": [
            {
                "value": "Sample description",
                "language" "en"
            }
        ],
        ...
    },
    {
        ...
        "names": [
            {
                "value": "Name",
                "language": "en"
            }
        ],
        ...
    }
]

回答您的第一个问题,我认为没有指定此类重命名的方法。这将是一个相当合理的选择,但是 JSON 提供程序在此处生成名称时也可以更聪明(它知道该类型可以表示 NameDescription,因此它可以生成一个名称Or 基于这些)。

作为技巧,您可以添加一个未使用的字段并使用正确的名称:

type A = JsonProvider<"""{
    "do not use": { "value_with_langauge": {"value":"A", "language":"A"} },
    "names": [ {"value":"A", "language":"A"} ],
    "descriptions": [ {"value":"A", "language":"A"} ]
  }""">

回答您的第二个问题 - 您的 namesdescriptions 字段已经是数组,即 ValueWithLanguge[]。为此,您不需要可选值。如果它们不存在,提供者只会给你一个空数组。