gpt4 book ai didi

c# - 如何让 OpenApi Generator 正确转换 Dictionary

转载 作者:行者123 更新时间:2023-12-03 20:22:53 27 4
gpt4 key购买 nike

现在我的 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 的默认设置是使用它的键作为属性名称将其序列化为对象——好处是类似于映射的查找函数,但代价是属性名称必须是字符串。
那么,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是为 Maps 设置 IDictonary 类型的地方。 Here是一般设置的地方, here用于 C#。这是创建 model 的 Mustache属性,这就是 API operation 的方式被 build 。

关于c# - 如何让 OpenApi Generator 正确转换 Dictionary<int, string>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67496140/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com