Как сериализовать F # различимые типы объединения в F # Asp Core Wep API - PullRequest
1 голос
/ 13 октября 2019

Я пытаюсь создать веб-API F # Asp.Net Core 3.0, куда я отправляю несколько записей F #. Насколько я знаю, Asp.Net Core 3.0 использует System.Text.Json по умолчанию для сортировки объектов в json. Для самодокументирования модели предметной области я использую F # дискриминированные типы объединений.

Модель выглядит следующим образом:

type Starttime =
    | NotStarted
    | Started of DateTime

type Category = {
    Name: string
    Starttime: Starttime
}

type ValueId = ValueId of String

type Value = {
    Id: ValueId
    Category: Category
}

Таким образом, у меня есть один тип объединения с одной возможностью ValueId, и яесть один тип объединения с двумя возможностями Starttime с NotStarted и Started, который содержит объект DateTime.

Теперь в моем контроллере я строю некоторые примеры данных и возвращаю их.

let isStarted i : Starttime =
    if i % 2 = 0 then
        Started DateTime.Now
    else
        NotStarted

[<HttpGet>]
member __.Get() : Value[] = 
    [|
        for index in 1..2 ->
            { 
                Id = ValueId (Guid.NewGuid().ToString())
                Category = {
                    Name = sprintf "Category %i" index
                    Starttime = isStarted index }
            }
    |]

Когда я смотрю на данные, возвращенные в json, я получаю данные для типа объединения с одним вариантом (Guid), но никогда не получаю значение для типа объединения с несколькими вариантами.

[
  {
    "id": {
      "tag": 0,
      "item": "6ed07303-6dfa-42b4-88ae-391bbebf772a"
    },
    "category": {
      "name": "Category 1",
      "starttime": {
        "tag": 0,
        "isNotStarted": true,
        "isStarted": false
      }
    }
  },
  {
    "id": {
      "tag": 0,
      "item": "5e122579-4945-4f19-919c-ad4cf16ad0ed"
    },
    "category": {
      "name": "Category 2",
      "starttime": {
        "tag": 1,
        "isNotStarted": false,
        "isStarted": true
      }
    }
  }
]

Кто-нибудь знает, как также отправить значения для типа объединения нескольких значений? Или вообще лучше сопоставить дискриминированные типы объединений с анонимными записями?

Спасибо!

1 Ответ

0 голосов
/ 14 октября 2019

В настоящее время System.Text.Json не поддерживает типы F # (об этом есть открытая проблема здесь )

На данный момент вы можете использовать эту библиотеку вместо этого.

...