【问题标题】:Swagger/NSwag: Redefine Parameter TypeSwagger/NSwag:重新定义参数类型
【发布时间】:2017-08-07 10:13:22
【问题描述】:

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

作为 ActionMethods 的 BodyParameters,我们使用带有后缀 Command 的类,其中包含例如参数创建一个持久化在数据库中的域对象。

Command-Class 可能如下所示:

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

虽然 Position 是一个简单的 int,但 Parent 是一个保存在数据库中的域类。可能看起来像这样:

public class Parent {

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

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

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

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

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

有什么方法可以告诉 swagger 替换父类的 Type 使其看起来像这样:

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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

    【讨论】:

    • 我是通过 TypeMappers 做到的:
    • JsonSchemaAttribute 在当前版本的 Swashbuckle 上似乎无法以这种方式工作。对生成的架构没有影响。
    • 这仅在使用 nswag/njs 生成规范时有效,但不适用于 swashbuckle
    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多