【问题标题】:Renaming type for FSharp.Data JsonProviderFSharp.Data JsonProvider 的重命名类型
【发布时间】:2020-07-24 12:33:02
【问题描述】:

我有一个如下所示的 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&lt;MyJsonProvider.NameOrDescription&gt;?还是我只需要定义 JSON 两次,一次使用所有可能的值,第二次使用强制值?

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

【问题讨论】:

    标签: f# f#-data


    【解决方案1】:

    要回答您的第一个问题,我认为没有办法指定此类重命名。这将是相当合理的选择,但 JSON 提供程序在此处生成名称时也可能更聪明(它知道该类型可以表示 Name 或 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"} ]
      }""">
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多