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

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

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

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

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

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

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

如何确保我的输出类具有 Dictionary<int,string> 而不是 Dictionary<string,string>

解决方法

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

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

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

您将使用此 KVP 模型发布 REST 操作,然后您将在 API 上放置一个自定义转换器,以在此 KVP 列表与字典之间进行转换。这将符合 OAS/JSON 并允许该 API/服务的非 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 返回字典,则需要修改 CodeGen Java。如果你去这么远的上游,一定要带上桨!

Here 是为地图设置 IDictonary 类型的地方。 Here 是一般设置的位置,而 here 用于 C#。这是创建 model 属性的 Mustache,这就是 API operation 的创建方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?