如何让 OpenApi Generator 正确转换 Dictionary<int, string>?

Dav*_*Dev 5 c# swagger openapi openapi-generator

现在我的 Api 返回一个模型,其中包含一个Dictionary<int, string>属性:

public Dictionary<int, string> Subdivisions { get; set; }
Run Code Online (Sandbox Code Playgroud)

当我运行 OpenApi Generator 时,输出类有

public Dictionary<string, string> Subdivisions { get; set; }
Run Code Online (Sandbox Code Playgroud)

我知道 JSON 规范不允许整数键,但这确实搞砸了那些期待 <int, string> 的 API 消费者。

我能做些什么来确保我的输出类有Dictionary<int, string>而不是Dictionary<string, string>

Mat*_* E. 7

由于 Swagger/OpenAPI 定义特定于 REST,它们可能会继续支持可以用 JSON 表示的模型。JSON 是一种与语言无关的序列化格式,支持对象和集合,但它没有方法或实际实现。REST 提供了改变服务器的 JSON 副本的方法,然后消费者需要根据需要解释响应。由于 JSON 中没有 Map,因此 IDictionary 的默认设置是使用它的键作为属性名称将其序列化为对象——好处是类似于映射的查找函数,但代价是属性名称必须是字符串。

那么,Dictionary<int,string>在有效的 JSON 中会是什么样子?使用自定义序列化器和反序列化器,我们可以期待 Key-Value-Pair 对象列表:

[
    {"key":1, "value": "one"},
    {"key":2, "value": "two"}
]
Run Code Online (Sandbox Code Playgroud)

您将使用此 KVP 模型发布 REST 操作,然后您将在 API 上放置一个自定义转换器,以在此 KVP 列表与字典之间进行转换。这将符合 OAS/JSON 并允许该 API/服务的非 REST 消费者期望 <int, string>。有几个示例说明如何执行此操作:

C# JSON 自定义序列化 https://www.newtonsoft.com/json/help/html/SerializingCollections.htm

但是,如果你真的需要从不符合标准的 swagger 定义中生成代码,则可以覆盖生成器以满足您的需求。将其视为一个警告,表明您的实现是不合时宜的,并且您为此代码生成所做的所有努力可能会被次要版本取消。最好找到一种方法来朝着社区的方向前进,以使您的解决方案具有最长的可行性。

话虽如此,生成器是一个简单的 Java 程序,它读取规范并使用 Mustache 模板输出文本文件。“CodeGen”类按照特定于语言的逻辑将规范解析为数组,然后将“Mustache”模板应用到数组上以生成代码。通过阅读 Java 作为指南,我通常能够通过仅修改 Mustache 模板或配置来生成我的自定义类。不幸的是,对于您的情况,returnTypefor an Operation 仅支持List 或 original,因此如果您希望生成的 API 返回字典,则需要修改 CodeGen Java。如果你去这么远的上游,一定要带上桨!

这里是为 Maps 设置 IDictonary 类型的地方。 这里是一般设置的地方,这里是 C#。这是创建模型属性的 Mustache,这就是 API操作的创建方式。