在C#中从动态Json对象动态生成OpenApiSchema

问题描述 投票:0回答:1

我希望从 .Net 6 中的任何给定 Json 对象动态生成

OpenApiSchema
。我在代码中没有可用的 clr 类型来自动生成 Swashbuckle 使用的 Open API Json,并且需要以编程方式执行此操作,而不是使用单个对象生成器工具。此外,这些 Json 对象会被其他用户频繁更改。我的目标是从给定的 json 负载动态创建 OpenAPI 规范。给定如下所示的随机 Json blob,并使用 C# 生成我自己的
OpenApiSchema
,类似于此方法 https://taerimhan.com/exploring-openapi-extensions-dynamic-schema/。我需要做的主要区别是将结果直接连接到 OpenAPI,以便 swashbuckle 渲染动态地为我提供 schmeas 和属性。查看示例 Json...

{
    "id": "123",
    "unassumablepropertyname1": {
        "id": "456",
        "otherprop": null
    },
    "dynamicproperty": "456",
    "somethinguseful": "ABC123"
}

理想的结果是动态生成这样的 OpenAPI V3 规范...

{
"openapi": "3.0.1",
"info": {
    "title": "Sample API Capabilities",
    "version": "v1"
},
"paths": {
    "/api/DataRecord/UpsertDynamicObj12": {
        "post": {
            "tags": [
                "Dynamic Objects"
            ],
            "operationId": "UpsertDynamicExample",
            "requestBody": {
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/DynamicObj12"
                        }
                    },
                    "text/json": {
                        "schema": {
                            "$ref": "#/components/schemas/DynamicObj12"
                        }
                    },
                    "application/*+json": {
                        "schema": {
                            "$ref": "#/components/schemas/DynamicObj12"
                        }
                    }
                }
            },
            "responses": {
                "200": {
                    "description": "Success"
                }
            }
        }
    }
},
"components": {
    "schemas": {
        "DynamicObj12": {
            "required": [
                "id"
            ],
            "type": "object",
            "properties": {
                "id": {
                    "type": "string"
                },
                "dynamicproperty": {
                    "type": "string"
                },
                "somethinguseful": {
                    "type": "string"
                },
                "unassumablepropertyname1": {
                    "type": "array",
                    "items": {
                        "$ref": "#/components/schemas/UnassumablePropertyName1"
                    },
                    "nullable": true
                }
            },
            "additionalProperties": false
        },
        "UnassumablePropertyName1": {
            "required": [
                "id"
            ],
            "type": "object",
            "properties": {
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "otherprop": {
                    "type": "string",
                    "format": "uuid"
                }
            },
            "additionalProperties": false
        }
    }
}
}

我查看了以下接近的资源,但我正在寻找 C# 解决方案,以便我可以将 Swashbuckle 用于不同 Json 形状的许多不同对象。

有什么想法吗?

c# json swagger swagger-ui swashbuckle
1个回答
-1
投票

不幸的是,根据我的探索,这是不可能的。 可以在 Swashbuckle 中构建 OpenAPI 的片段,但我不知道如何在您的案例中应用它。

编辑:Swashbuckle 用于静态生成。 您不能使用 Swashbuckle,因为这是使用您想要禁用的 Swashbuckle 的主要原因。 对于我的项目,最简单的方法是使用动态语言来完成它,其中我使用模式作为在不同位置协商的数据(由用户定义)。 请注意,模式是静态的,因此如果在其他地方不同意将其作为数据,您的 API 就会变得困难或无法使用,因为它只是接收者需要解析的字符串。动态 Json 对象没有足够的信息来推断架构及其保存的数据,因此将其用作架构作为数据还不够好。

© www.soinside.com 2019 - 2024. All rights reserved.