现在,我的Api返回一个包含Dictionary<int, string>
属性的模型:
public Dictionary<int, string> Subdivisions { get; set; }
当我运行OpenApi生成器时,输出类具有
public Dictionary<string, string> Subdivisions { get; set; }
我知道JSON规范不允许整数键,但这确实使期望的API的使用者感到困惑。
如何确保我的输出类有Dictionary<int, string>
而不是Dictionary<string, string>
发布于 2021-05-14 07:52:30
由于Swagger/OpenAPI定义是特定于REST的,它们很可能继续支持可以用JSON表示的模型。JSON是一种与语言无关的序列化格式,支持对象和集合,但它没有方法或实际实现。REST提供了改变服务器JSON副本的方法,然后要求使用者根据需要解释响应。由于JSON中没有Map,所以IDictionary的默认做法是将其序列化为一个对象,使用它的键作为属性名--好处是类似于映射的查找函数,但是代价是属性名称必须是字符串。
那么,在有效的JSON中,Dictionary<int,string>
会是什么样的呢?使用自定义序列化程序和反序列化程序,我们可以期望得到键值对对象的列表:
[
{"key":1, "value": "one"},
{"key":2, "value": "two"}
]
您将使用这个KVP模型发布REST操作,然后在您的API上放置一个自定义转换器,以将这个KVP列表转换成字典。这将符合美洲组织/JSON,并允许期望的API/service的非REST使用者。关于如何做到这一点,有几个例子:
C# JSON自定义序列化 https://www.newtonsoft.com/json/help/html/SerializingCollections.htm
但是,如果您确实需要从不符合标准的傲慢定义中生成代码,则可以重写生成器以满足您的需要。把它看作是一种警告,即您的实现是反粒度的,您在这个代码元中所做的所有努力都可能被小版本所取消。最好是找到一条道路,朝着社区的方向前进,让您的解决方案具有最长的可行性。
话虽如此,生成器是一个简单的Java程序,它可以读取规范,并使用穆斯塔赫模板输出文本文件。"CodeGen“类将规范解析为遵循特定于语言的逻辑的数组,然后将”穆斯塔赫“模板应用于逻辑,而不是应用于数组之上以生成代码。通过阅读Java作为指南,我通常能够通过只修改胡子模板或配置来生成我的自定义类。不幸的是,对于您的情况,用于操作的returnType
只支持列表或原语,因此,如果您希望生成一个API来返回字典,则需要修改CodeGen Java。如果你往上游走,一定要带一只桨!
这里是为地图设置IDictonary类型的地方。这里是通用设置它的地方,这里是C#的集合。这是创建模型属性的胡子,这是API 操作的创建方式。
https://stackoverflow.com/questions/67496140
复制相似问题