如何解决如何让 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 规范不允许整数键,但这确实搞砸了那些期待
如何确保我的输出类具有 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 举报,一经查实,本站将立刻删除。