Storm
Storm

Reputation: 3242

Renaming type for FSharp.Data JsonProvider

I have a JSON that looks something like this:

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

When using JsonProvider from the FSharp.Data library, it maps both fields as the same type MyJsonProvider.Name. This is a little confusing when working with the code. Is there any way how to rename the type to MyJsonProvider.NameOrDescription? I have read that this is possible for the CsvProvider, but typing

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

results in an error.

Also, is it possible to define that the Description field is actually an Option<MyJsonProvider.NameOrDescription>? Or do I just have to define the JSON twice, once with all possible values and the second time just with mandatory values?

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

Upvotes: 2

Views: 66

Answers (1)

Tomas Petricek
Tomas Petricek

Reputation: 243051

To answer your first question, I do not think there is a way of specifying such renaming. It would be quite reasonable option, but the JSON provider could also be more clever when generating names here (it knows that the type can represent Name or Description, so it could generate a name with Or based on those).

As a hack, you could add an unusued field with the right name:

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

To answer your second question - your names and descriptions fields are already arrays, i.e. ValueWithLanguge[]. For this, you do not need an optional value. If they are not present, the provider will simply give you an empty array.

Upvotes: 3

Related Questions