1

我正在尝试Todo使用 Suave 创建一个简单的 REST API。Todo类型定义为:

type Todo =
    { id: Guid
      title: string
      isComplete: bool
      deadline: DateTime option }

这种类型在使用Get By IdGET /todos/{guid}Get ListGET /todos/ API 时非常有效。但是在创建新Todo项目时,有效负载不包含id属性,因为它将作为数据库操作的一部分自动生成。因此,进行了以下 REST API 调用:

POST /todos/

{
    "title": "Hello world",
    "isComplete": false,
    "deadline": null
}

但是,问题是 JSON 反序列化中断,因为该id字段不可用。如何处理这种情况?声明idasoption感觉不对,因为它不是正确的抽象。在 TypeScript 中,我可以使用 , 等实用程序类型OmitPick创建新类型,例如:

export interface Todo {
    id: string;
    title: string;
    isComplete: boolean;
    deadline?: string
}

// Create new Type from existing type!
export type TodoInput = Omit<Todo, 'id'>;

let payload: TodoInput = {
    isComplete: false,
    title: "Hello"
}

如何在 F# 中获得类似的结果?

4

1 回答 1

2

即使您没有 id,您也应该能够反序列化。以下对我来说很好。id 将为 Guid.empty。

open Newtonsoft.Json

type Todo =
    { id: Guid
      title: string
    }

let data = JsonConvert.DeserializeObject<Todo>("{\"title\":\"test\"}")
于 2020-06-13T21:12:41.327 回答