当前位置: 首页 > 知识库问答 >
问题:

为字典< SomeEnum,string >生成摆动

孔理
2023-03-14

我用的是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 ”,但是我不知道如何去做。

或者有没有办法让斯瓦布克尔把道具字典更像字典一样对待

从这篇文章来看,它就像一本字典

共有1个答案

梁盛
2023-03-14

这是我最后的结果。它将类型转换为泛型对象(其中属性必须为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,在这种