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

How can I get OpenApi Generator to convert Dictionary<int, string> correctly?

现在我的 Api returns 模型里面有 Dictionary<int, string> 属性:

public Dictionary<int, string> Subdivisions { get; set; }

当我运行打开Api生成器时,输出class有

public Dictionary<string, string> Subdivisions { get; set; }

我知道 JSON 规范不允许整数键,但这确实让那些期待 .

的 API 的消费者搞砸了

我该怎么做才能确保我的输出 class 具有 Dictionary<int, string> 而不是 Dictionary<string, string>

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

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

[
    {"key":1, "value": "one"},
    {"key":2, "value": "two"}
]

您将使用此 KVP 模型发布 REST 操作,然后您将在您的 API 上放置一个自定义转换器以将此 KVP 列表与字典相互转换。这将符合 OAS/JSON 并允许 API/service 的非 REST 消费者期待 。有几个如何执行此操作的示例:

C# JSON custom serialization https://www.newtonsoft.com/json/help/html/SerializingCollections.htm

但是,如果您真的需要从不符合标准的 swagger 定义生成代码,则有可能覆盖生成器以满足您的需求。将其视为一个警告,表明您的实施是违背原则的,您为此代码生成所做的所有努力都可能被次要版本付诸东流。最好找到一种方法朝着社区的方向发展,以使您的解决方案具有最长的可行性。

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

Here is where the IDictonary type is set for Maps. Here is where it is set generically, and here is for C#. This is the Mustache that creates a model property, and this is the how the API operation 已创建。