Swagger / NSwag:重新定义参数类型

时间:2017-08-07 10:13:22

标签: c# json asp.net-web-api2 swagger nswag

我们使用swagger / nswag来记录webapi项目。

作为ActionMethods的BodyParameters,我们使用带有后缀Command的类,其中包含参数,例如:创建一个持久存储在数据库中的Domain-Object。

Command-Class可能如下所示:

public class CreateChildCommand {
    public Parent Parent { get; set; }
    public int Position { get; set; }
}

虽然Position是一个简单的int,但Parent是一个持久存储在数据库中的Domain-Class。可能看起来像这样:

public class Parent {

    public Guid Id { get; set; }
    public string Name { get; set; }
    ...
}

它可以通过Id从数据库加载,所以我们只需在命令参数的Json中传递id作为参数,如下所示:

{
    "Position": 3,
    "Parent": "41E71207-7F1E-4895-8BCC-14E1293A7907"
}

反序列化Json时,父级通过Dao通过其Id加载。 现在的问题是,swagger / nswag不理解“魔术”并显示方法的参数如下:

{
    "Position": number,
    "Parent": {
         Id: "Guid",
         "Name": "string",
         ...
    }
}

有没有办法告诉swagger替换父类型,使它看起来像这样:

{
    "Position": "int",
    "Parent": "Guid"
}

1 个答案:

答案 0 :(得分:2)

您可以使用JsonSchemaAttribute属性覆盖复杂属性的架构类型:

public class CreateChildCommand {
    [JsonSchema(JsonObjectType.String, Format = "guid")]
    public Parent Parent { get; set; }

    public int Position { get; set; }
}

该属性在NJsonSchema库中实现:https://www.nuget.org/packages/NJsonSchema/

另一种选择是使用类型映射器将所有父类映射到字符串,请参阅https://github.com/RSuter/NJsonSchema/wiki/Type-Mappers