我用的是Swashbuckle。AspNetCore.Swagger生成一个Swagger文档,然后使用NSwag生成一个C# SDK。
我有几节课用字典
namespace Sample
{
/// <summary>Possible properties for MyClass1 objects</summary>
[JsonConverter(typeof(StringEnumConverter))]
public enum PropEnum1
{
/// <summary>OpenAPI doesn't see this description</summary>
PropName1,
PropName2,
PropName3,
// and more property names
}
/// <summary>The first class...</summary>
public class MyClass1
{
public string Name { get; set; }
/// <summary>Properties that vary from instance to instance.</summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public IDictionary<PropEnum1, string> Props { get; set; }
}
// There is also a PropEnum2 and MyClass2, but let's stay simple
}
使用Swashbuckle 6.14,我最终得到了看起来像这样的摇摆不定:
"MyClass1": {
"type": "object",
"properties": {
"name": {
"type": "string",
"nullable": true
},
"props": {
"type": "object",
"properties": {
"PropName1": {
"type": "string"
},
"PropName2": {
"type": "string"
},
"PropName3": {
"type": "string"
}
},
"additionalProperties": false,
"description": "Properties that vary from instance to instance.",
"nullable": true
}
},
"additionalProperties": false,
"description": "The first class..."
}
然后NSwag生成一个C#接口,如下所示:
/// <summary>The first class...</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.3.0 (Newtonsoft.Json v12.0.0.0)")]
public partial class MyClass1
{
[Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Name { get; set; }
/// <summary>Properties that vary from instance to instance.</summary>
[Newtonsoft.Json.JsonProperty("props", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public Props Props { get; set; }
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.3.0 (Newtonsoft.Json v12.0.0.0)")]
public partial class Props
{
[Newtonsoft.Json.JsonProperty("PropName1", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string PropName1 { get; set; }
[Newtonsoft.Json.JsonProperty("PropName2", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string PropName2 { get; set; }
[Newtonsoft.Json.JsonProperty("PropName3", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string PropName3 { get; set; }
}
我发现Props类的生成对每个可能的枚举值都有一个成员有点令人惊讶,但我可以接受它。
问题在于 MyClass1 的实例可能不具有所有属性。我有一个返回 MyClass1 实例的 API。它从 swagger 页面工作,但使用 NSwag SDK 会给我一个错误“牛顿软件.Json.Json序列化异常:必需属性 'PropName2' 需要一个非空值。
眼前的问题是生成的 Props 类中的不允许取消。如果我手动编辑它们从“禁用”到“默认”,SDK 将按预期工作。但是手工编辑生成的代码并不好。
不允许取消来自炫耀者中的 PropName 属性,未将“可空”设置为 true。如果我暂停生成过程并将它们手动编辑到 swagger 中,则会在生成的 C# 代码中获得 Required.Default。但手工编辑生成的摇摆不定也不好。
因此,解决这个问题的一个方法是在属性中加入一个“nullable ”,但是我不知道如何去做。
或者有没有办法让斯瓦布克尔把道具字典更像字典一样对待
从这篇文章来看,它就像一本字典
这是我最后的结果。它将类型转换为泛型对象(其中属性必须为value eType。请注意,我已经将枚举序列化为字符串,因此这可能不适合其他人。
/// <summary>
/// For properties that are Dictionary[SomeEnum, valueType] alter the schema
/// so the generated SDK code will be IDictionary[string, valueType].
/// </summary>
public class EnumDictionaryToStringDictionarySchemaFilter : ISchemaFilter
{
/// <summary>
/// Apply the schema changes
/// </summary>
/// <param name="schema">The schema model</param>
/// <param name="context">The schema filter context</param>
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
// Only for fields that are Dictionary<Enum, TValue>
//
if (!context.Type.IsGenericType)
return;
if (!context.Type.GetGenericTypeDefinition().IsAssignableFrom(typeof(Dictionary<,>))
&& !context.Type.GetGenericTypeDefinition().IsAssignableFrom(typeof(IDictionary<,>)))
return;
var keyType = context.Type.GetGenericArguments()[0];
if (!keyType.IsEnum)
return;
var valueType = context.Type.GetGenericArguments()[1];
var valueTypeSchema = context.SchemaGenerator.GenerateSchema(valueType, context.SchemaRepository);
schema.Type = "object";
schema.Properties.Clear();
schema.AdditionalPropertiesAllowed = true;
schema.AdditionalProperties = valueTypeSchema;
}
}
问题内容: 使用深度嵌套的python字典,我希望能够在这样的数据结构中分配值: 无需检查mydict [key]等实际上是否设置为dict,例如使用 附属词典的创建应即时进行。允许等效的最优雅的方法是什么-也许在标准上使用装饰器? 问题答案: class D(dict): def missing(self, key): self[key] = D() return self[key]
我在使用csvreader创建字典密钥时遇到问题。我想创建一个字典,其中包含找到数据的位置列,以便以后可以将其写到新位置。我没有包括write函数,因为我想先了解如何创建键。 例如,该数据点123-123-1234位于第[0]行。 正在读取的当前输入注意,2个条目没有要匹配的模式。 信息、地址、城市、ZipCode、上次更新 Lorem ipsum dolor sit amet,Concetetu
问题内容: 就像是: 此代码引发异常,因为在迭代时更改了字典。 我发现另一本词典只有非常规的解决方案: 谢谢 问题答案: 另一种写法是 在Python3中,这变成
本文向大家介绍PHP实现生成数据字典功能示例,包括了PHP实现生成数据字典功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现生成数据字典功能。分享给大家供大家参考,具体如下: 最近时间紧迫,没有时间发博客,趁现在有点时间向大家分享一个知识点。在咱们做开发的时候 ,也许经常会遇到对数据库分析,做一个数据字典,那么现在好处来了,大家只需要关注我所发送的这个链接轻轻松松帮你们搞定
我正在使用插件从文件生成源代码。问题是生成的是而不是。我添加了文件,该文件如下所示: 这应防止生成。但它不起作用我仍然生成了而不是。 我的插件如下所示: 版本为。有人知道问题出在哪里吗? XSD非常庞大。这是生成的元素 生成的源是:
我们有JAVA gradle avro插件(davidmc24/gradle avro-plugin)生成施玛篇,并使用默认的stringType字符串,它将生成JAVA POJO如下: 然后我们使用相同的avdl文件来生成C#包,我们的解决方案是首先用avro-tools-1.9.1.jar生成avsc文件,这样就会生成avsc 我们有一个C#producer和java consumer,在这种