首页 > 解决方案 > FSharp.Data JsonProvider 的重命名类型

问题描述

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

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

JsonProvider从库中使用时FSharp.Data,它将两个字段映射为相同的类型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"
            }
        ],
        ...
    }
]

标签: f#f#-data

解决方案


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

作为 hack,您可以添加一个未使用的具有正确名称的字段:

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[]. 为此,您不需要可选值。如果它们不存在,提供者只会给你一个空数组。


推荐阅读