【问题标题】:How can I get OpenApi Generator to convert Dictionary<int, string> correctly?如何让 OpenApi Generator 正确转换 Dictionary<int, string>?
【发布时间】:2021-05-12 01:13:12
【问题描述】:

现在我的 Api 返回一个带有 Dictionary&lt;int, string&gt; 属性的模型:

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

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

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

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

如何确保我的输出类具有Dictionary&lt;int, string&gt; 而不是Dictionary&lt;string, string&gt;

【问题讨论】:

  • 可以添加OpenApi json吗?
  • @VovaBilyachat 不是真的。这是公司数据,我不能分享。
  • 怀疑可能。你可以阅读 NSwag 关于它的讨论 herehere。听起来他们可能已经完成了这个功能,也许。此功能根本不是 OpenAPI 规范的一部分(能够定义键的 type,因为键在 JSON 世界中只能是字符串)。
  • 请问您如何处理得到字符串后无法将其转为整数的消耗?
  • 考虑在响应文档中使用example

标签: c# swagger openapi openapi-generator


【解决方案1】:

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

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

[
    {"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 的方式。

【讨论】:

  • 信息量很大的文档链接!
  • 感谢您的全面回答。我现在正在处理另一张票,但我会在几天后回来处理这个问题。当我实施建议并添加任何相关注释时,我会将其标记为正确。
  • REST 架构根本没有提到 JSON。 ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 2011-03-05
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
相关资源
最近更新 更多