সোয়াগার ইউআই ওয়েব এপি ডকুমেন্টেশন স্ট্রিং হিসাবে এনামগুলিকে উপস্থাপন করেন?


119

সমস্ত এনামগুলিকে তাদের মান মানের পরিবর্তে সোয়াগারে তার স্ট্রিং মান হিসাবে প্রদর্শন করার কোনও উপায় আছে?

আমি পোষ্ট ক্রিয়া জমা দিতে এবং এনামগুলিকে প্রতিবার এনামের দিকে না তাকিয়ে তাদের স্ট্রিংয়ের মান অনুযায়ী রাখতে সক্ষম হতে চাই।

আমি চেষ্টা করেছিলাম DescribeAllEnumsAsStringsতবে সার্ভারটি এনাম মানের পরিবর্তে স্ট্রিংগুলি পেয়ে থাকে যা আমরা যা খুঁজছি তা নয়।

কেউ কি এর সমাধান করেছেন?

সম্পাদনা করুন:

public class Letter 
{
    [Required]
    public string Content {get; set;}

    [Required]
    [EnumDataType(typeof(Priority))]
    public Priority Priority {get; set;}
}


public class LettersController : ApiController
{
    [HttpPost]
    public IHttpActionResult SendLetter(Letter letter)
    {
        // Validation not passing when using DescribeEnumsAsStrings
        if (!ModelState.IsValid)
            return BadRequest("Not valid")

        ..
    }

    // In the documentation for this request I want to see the string values of the enum before submitting: Low, Medium, High. Instead of 0, 1, 2
    [HttpGet]
    public IHttpActionResult GetByPriority (Priority priority)
    {

    }
}


public enum Priority
{
    Low, 
    Medium,
    High
}

4
আপনি কি চান যে স্কিমা মানটিকে স্ট্রিং হিসাবে বর্ণনা করবে তবে তারপরে সার্ভারে একটি পূর্ণসংখ্যা পোস্ট করবে? JSON.net উভয় মান ঠিকঠাক পরিচালনা করবে, সুতরাং পূর্ণসংখ্যার একমাত্র সংস্করণ একটি নির্দিষ্ট প্রয়োজনীয়তা? আমার মনে হয় না সোয়াগার স্ট্রিং এবং পূর্ণসংখ্যার মান উভয়ের সাথে এনাম টাইপ সমর্থন করে।
হাক্স

4
আপনার প্রত্যাশিত আচরণটি অস্পষ্ট, আপনি কীভাবে সোয়াগার ইউআই প্রদর্শন করতে চান এবং উদাহরণ সহ আপনার ওয়েব এপিআইতে আপনি কী পোস্ট / পুট করতে চান তা আরও ভালভাবে ব্যাখ্যা করতে পারেন?
ফেডেরিকো ডিপুমা

তদুপরি, যদি আমার কাছে জিইটি পদ্ধতি থাকে যা ইউআরএল এ এনাম গ্রহণ করে তবে আমি চাই যে প্রকল্পটি প্রস্তাবিত মানগুলির ড্রপ ডাউন তালিকার স্ট্রিং হিসাবে বর্ণনা করতে পারে

পূর্ণসংখ্যার বৈধতা কেন ব্যর্থ হয়? প্রকারটি মডেলের একটি এনাম হওয়া উচিত এবং জসন মিডিয়া ফর্ম্যাটরটি সঠিকভাবে স্ট্রিং বা ইন্টি হ্যান্ডেল করতে পারে। আপনি যদি উদাহরণটি দিয়ে প্রশ্নটি আপডেট করেন তবে এটি কেন আমাদের বৈধতা ব্যর্থ হচ্ছে তা বুঝতে সহায়তা করবে।
হাক্স

5
এটি যদি কোনও পতাকা এনুম হয় তবে পতাকাগুলির প্রতিটি সংমিশ্রণের জন্য এনামের মান নির্ধারিত না হলে এটি সংখ্যাটি হতে হবে। এটি বাদাম যে swagger প্রতিটি এনামের জন্য নাম এবং মান উভয় প্রদর্শন করে না এবং পরিবর্তে একা সংখ্যা (অকেজো) বা একা নাম প্রদর্শন করে (আবার, পতাকাগুলির জন্য অকেজো যা সংখ্যা হিসাবে নির্দিষ্ট করা আবশ্যক)।
ট্রায়ঙ্কো

উত্তর:


189

ডক্স থেকে :

httpConfiguration
    .EnableSwagger(c => 
        {
            c.SingleApiVersion("v1", "A title for your API");

            c.DescribeAllEnumsAsStrings(); // this will do the trick
        });

এছাড়াও, আপনি যদি কেবল কোনও নির্দিষ্ট ধরণের এবং সম্পত্তিতেই এই আচরণটি চান তবে স্ট্রিংইনম কনভার্টারটি ব্যবহার করুন:

public class Letter 
{
    [Required]
    public string Content {get; set;}

    [Required]
    [EnumDataType(typeof(Priority))]
    [JsonConverter(typeof(StringEnumConverter))]
    public Priority Priority {get; set;}
}

6
এই আমার জন্য কাজ করে না [EnumDataType (typeof (অগ্রতা))] [JsonConverter (typeof (StringEnumConverter))]।
লিনেকার

@ এনএইচ। হ্যাঁ, আমি newtonsoft.json ব্যবহৃত
লিনেকার

@ লাইনার, এই ত্রুটিটিকে নতুন প্রশ্ন হিসাবে পোস্ট করুন, এই গাইডটিকে অনুসরণ করে: stackoverflow.com/help/mcve
NH

6
DescribeAllEnumsAsStringsনিয়ামক পদক্ষেপের জন্য অবজেক্ট বৈশিষ্ট্য এমনকি ক্যোয়ারী প্যারামিটারের জন্য কাজ করেছে। তবে, ব্যবহার EnumDataTypeAttributeএবং JsonConverter(typeof(StringEnumConverter))আমার জন্য কাজ করে না।
বাগিগ্রেড 87

4
এই সমাধানটি অ্যাডএমভিসি-র অ্যাডনেউটনসফটজসন বিভাগে রূপান্তরকারী হিসাবে স্ট্রিংইউনম কনভার্টার নিবন্ধনের গুরুত্বপূর্ণ পদক্ষেপ বাদ দেয় । নীচে @ রোমান স্টারকভ উত্তরে উদাহরণ দেখুন।
এ। ট্রেটিয়াকভ

126

মাইক্রোসফ্ট জেএসওএন লাইব্রেরি (সিস্টেম.টেক্সট.জসন) সহ এএসপি.নেট কোর 3 এর জন্য

স্টার্টআপ.সি / কনফিগার সার্ভিসগুলিতে ():

services
    .AddControllersWithViews(...) // or AddControllers() in a Web API
    .AddJsonOptions(options => 
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));

জেএসন.এনইটি (নিউটনসফট.জেসন) লাইব্রেরির সাথে এএসপি.নেট কোর 3 এর জন্য

Swashbuckle.AspNetCore.Newtonsoftপ্যাকেজ ইনস্টল করুন ।

স্টার্টআপ.সি / কনফিগার সার্ভিসগুলিতে ():

services
    .AddControllersWithViews(...)
    .AddNewtonsoftJson(options => 
        options.SerializerSettings.Converters.Add(new StringEnumConverter()));
// order is vital, this *must* be called *after* AddNewtonsoftJson()
services.AddSwaggerGenNewtonsoftSupport();

এএসপি.নেট কোর 2 এর জন্য

স্টার্টআপ.সি / কনফিগার সার্ভিসগুলিতে ():

services
    .AddMvc(...)
    .AddJsonOptions(options => 
        options.SerializerSettings.Converters.Add(new StringEnumConverter()));

প্রাক- ASSP.NET কোর

httpConfiguration
    .EnableSwagger(c => 
        {
            c.DescribeAllEnumsAsStrings();
        });

4
বিকল্পগুলি ব্যবহার করার ক্ষেত্রে সমস্যা Sসরিশালাইজারসেটিংস.কনভার্টারস .এড (নতুন স্ট্রিংইনম কনভার্টার ()) আপনার হ'ল কেবল সাশবাকলের জন্য নয়, আপনার সমস্ত পদ্ধতির জন্য জেএসন পরিবর্তন করা।
গিলিয়াম

কারও কাছে অ্যাজুরে ফাংশন ভি 2 এবং / অথবা ভি 3 এর সমাধান রয়েছে?
ড্যান ফ্রেডম্যান

@ ড্যানফ্রিডম্যান বিবেচনা করে স্বশবাকল অ্যাজুরে ফাংশনগুলি নিয়ে মোটেও কাজ করে না, আপনার ভাগ্য নেই।
ইয়ান কেম্প

@ ইয়ানকেম্প AzureExtensions.Swashbuckleপ্যাকেজটির সাথে তৃতীয় পক্ষের সমর্থন রয়েছে তবে @ ডানফ্রিডম্যানের মতো আমি এনাম-টু-স্ট্রিংকে প্রত্যাশা অনুযায়ী কাজ করতে পারব না
wolfyuk

আপনি যদি নিউটনসফ্টের সাথে এএসপি.নেট কোর 3 এর জন্য কনফিগার করছেন তবে AddSwaggerGenNewtonsoftSupport()এক্সটেনশন পদ্ধতিটি নুগেট প্যাকেজ থেকে উপলব্ধ Swashbuckle.AspNetCore.Newtonsoft। এখানে আরও পড়ুন: github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/…
অ্যান্ডি ভাল

41

সুতরাং আমার মনে হয় আমারও একই সমস্যা রয়েছে। আমি ইনট -> স্ট্রিং ম্যাপিংয়ের সাথে এনামগুলি তৈরি করতে সোয়াগার খুঁজছি। এপিআই অবশ্যই অন্তর্ভুক্ত গ্রহণ করতে হবে। সোয়াগার-ইউআই কম গুরুত্ব দেয়, আমি যা চাই তা হল অন্যদিকে "রিয়েল" এনাম সহ কোড জেনারেশন (এই ক্ষেত্রে retrofit ব্যবহার করে অ্যান্ড্রয়েড অ্যাপ্লিকেশন)।

সুতরাং আমার গবেষণা থেকে শেষ পর্যন্ত এটিকে ওপেনপিআই স্পেসিফিকেশনের সীমা হিসাবে মনে হয় যা সোয়াগার ব্যবহার করে। এনামগুলির জন্য নাম এবং সংখ্যা নির্দিষ্ট করা সম্ভব নয়।

আমি যে সেরা ইস্যুটি অনুসরণ করতে পেরেছি তা হ'ল https://github.com/OAI/OpenAPI-Specifications/issues/681 যা "সম্ভবত শীঘ্রই" মনে হচ্ছে তবে স্ব্যাগার আপডেট হতে হবে, এবং আমার ক্ষেত্রে Swashbuckle হিসাবে আমরা হব.

আপাতত আমার কাজটি হ'ল একটি ডকুমেন্ট ফিল্টার প্রয়োগ করা হয়েছে যা এনামগুলির জন্য অনুসন্ধান করে এবং এনামের বিষয়বস্তু সহ প্রাসঙ্গিক বিবরণকে জনপ্রিয় করে তোলে।

        GlobalConfiguration.Configuration
            .EnableSwagger(c =>
                {
                    c.DocumentFilter<SwaggerAddEnumDescriptions>();

                    //disable this
                    //c.DescribeAllEnumsAsStrings()

SwaggerAddEnumDesifications.cs:

using System;
using System.Web.Http.Description;
using Swashbuckle.Swagger;
using System.Collections.Generic;

public class SwaggerAddEnumDescriptions : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
    {
        // add enum descriptions to result models
        foreach (KeyValuePair<string, Schema> schemaDictionaryItem in swaggerDoc.definitions)
        {
            Schema schema = schemaDictionaryItem.Value;
            foreach (KeyValuePair<string, Schema> propertyDictionaryItem in schema.properties)
            {
                Schema property = propertyDictionaryItem.Value;
                IList<object> propertyEnums = property.@enum;
                if (propertyEnums != null && propertyEnums.Count > 0)
                {
                    property.description += DescribeEnum(propertyEnums);
                }
            }
        }

        // add enum descriptions to input parameters
        if (swaggerDoc.paths.Count > 0)
        {
            foreach (PathItem pathItem in swaggerDoc.paths.Values)
            {
                DescribeEnumParameters(pathItem.parameters);

                // head, patch, options, delete left out
                List<Operation> possibleParameterisedOperations = new List<Operation> { pathItem.get, pathItem.post, pathItem.put };
                possibleParameterisedOperations.FindAll(x => x != null).ForEach(x => DescribeEnumParameters(x.parameters));
            }
        }
    }

    private void DescribeEnumParameters(IList<Parameter> parameters)
    {
        if (parameters != null)
        {
            foreach (Parameter param in parameters)
            {
                IList<object> paramEnums = param.@enum;
                if (paramEnums != null && paramEnums.Count > 0)
                {
                    param.description += DescribeEnum(paramEnums);
                }
            }
        }
    }

    private string DescribeEnum(IList<object> enums)
    {
        List<string> enumDescriptions = new List<string>();
        foreach (object enumOption in enums)
        {
            enumDescriptions.Add(string.Format("{0} = {1}", (int)enumOption, Enum.GetName(enumOption.GetType(), enumOption)));
        }
        return string.Join(", ", enumDescriptions.ToArray());
    }

}

এটি আপনার স্ব্যাগার-ইউআইতে নিম্নলিখিতগুলির মতো কিছুতে ফলাফল দেয় যাতে অন্তত আপনি "আপনি কী করছেন তা" দেখতে পারেন: এখানে চিত্র বর্ণনা লিখুন


4
+1 আমি এনামগুলিতে বিবরণ যুক্ত করতে চাইছিলাম (কেবল 'এনাম বর্ণনা করতে'), এটি কখনই ভাবেনি। আমার কাছে ইতিমধ্যে মিস্ক ফিল্টার রয়েছে, তবে আরও কিছু 'জৈব' খুঁজছিলাম, কিন্তু কোনও সমর্থন নেই। ঠিক আছে তবে,
সমস্তভাবে

ধন্যবাদ! আমি এটি আমার প্রকল্পে ব্যবহার করেছি, তবে এটি নেট। কোর সাথে কাজ করার জন্য পরিবর্তন করেছি। আমি উত্তর হিসাবে আমার বাস্তবায়ন যোগ।
গ্যাব্রিয়েল লুসি

30

এএসপি.নেট কোর 3.1

নিউটোনসফট জেএসওএন ব্যবহার করে স্ট্রিং হিসাবে এনামগুলি তৈরি করতে আপনাকে অবশ্যই AddSwaggerGenNewtonsoftSupport()নিম্নলিখিতগুলি যোগ করে স্পষ্টভাবে নিউটনসফট সমর্থন যুক্ত করতে হবে :

services.AddMvc()
    ...
    .AddNewtonsoftJson(opts =>
    {
        opts.SerializerSettings.Converters.Add(new StringEnumConverter());
    });


services.AddSwaggerGen(...);
services.AddSwaggerGenNewtonsoftSupport(); //

এটি একটি নতুন প্যাকেজের মাধ্যমে উপলব্ধ Swashbuckle.AspNetCore.Newtonsoft। দেখে মনে হচ্ছে এনাম কনভার্টার সমর্থন ব্যতীত এই প্যাকেজটি ছাড়া অন্য সমস্ত কিছুই সূক্ষ্মভাবে কাজ করে।


4
এটি বিশ্বব্যাপী এই কনভেনশনটি সেটআপ করতে সহায়তা করে, তবে আপনার যদি এটিকে কেবল নির্দিষ্ট ধরণের এনামগুলিতে প্রয়োগ করতে হয় তবে আপনার এই সমস্যাটি যত্ন সহকারে পড়তে হবে । টিএল; ডিআর: কেবলমাত্র সম্পত্তিতে নতুন স্ট্রিংইনম কনভার্টার () প্রয়োগ করা সম্ভব নয়, তবে আপনি এটি পুরো এনাম টাইপের ক্ষেত্রে প্রয়োগ করতে পারেন।
এ। ট্রেটিয়াকভ

4
আমি মনে করি আমরা যদি গ্যাটাচসের কথা বলি তবে সম্পূর্ণ কাস্টম রূপান্তরকারী ব্যবহার করাও সম্ভব নয়। সোয়াগার কাস্টম রূপান্তরকারী দ্বারা এনাম মানগুলি চালায় না; এটি কেবল StringEnumConverterএকটি বিশেষ কেস হিসাবে স্বীকৃতি দেয় ।
রোমান স্টারকভ

22

আমি .NET কোর অ্যাপ্লিকেশনটিতে ররি_জার উত্তরটি ব্যবহার করতে চেয়েছিলাম, তবে এটি কার্যকর করতে আমাকে এটিকে কিছুটা পরিবর্তন করতে হয়েছিল। এনট কোরের জন্য আমি এখানে এসেছি বাস্তবায়ন।

আমি এটিও পরিবর্তন করেছি যাতে এটি অন্তর্নিহিত ধরণটি ধরে না নেয় intএবং সহজ পাঠের জন্য মানগুলির মধ্যে নতুন লাইন ব্যবহার করে।

/// <summary>
/// Add enum value descriptions to Swagger
/// </summary>
public class EnumDocumentFilter : IDocumentFilter {
    /// <inheritdoc />
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context) {
        // add enum descriptions to result models
        foreach (var schemaDictionaryItem in swaggerDoc.Definitions) {
            var schema = schemaDictionaryItem.Value;
            foreach (var propertyDictionaryItem in schema.Properties) {
                var property = propertyDictionaryItem.Value;
                var propertyEnums = property.Enum;
                if (propertyEnums != null && propertyEnums.Count > 0) {
                    property.Description += DescribeEnum(propertyEnums);
                }
            }
        }

        if (swaggerDoc.Paths.Count <= 0) return;

        // add enum descriptions to input parameters
        foreach (var pathItem in swaggerDoc.Paths.Values) {
            DescribeEnumParameters(pathItem.Parameters);

            // head, patch, options, delete left out
            var possibleParameterisedOperations = new List<Operation> {pathItem.Get, pathItem.Post, pathItem.Put};
            possibleParameterisedOperations.FindAll(x => x != null)
                .ForEach(x => DescribeEnumParameters(x.Parameters));
        }
    }

    private static void DescribeEnumParameters(IList<IParameter> parameters) {
        if (parameters == null) return;

        foreach (var param in parameters) {
            if (param is NonBodyParameter nbParam && nbParam.Enum?.Any() == true) {
                param.Description += DescribeEnum(nbParam.Enum);
            } else if (param.Extensions.ContainsKey("enum") && param.Extensions["enum"] is IList<object> paramEnums &&
                paramEnums.Count > 0) {
                param.Description += DescribeEnum(paramEnums);
            }
        }
    }

    private static string DescribeEnum(IEnumerable<object> enums) {
        var enumDescriptions = new List<string>();
        Type type = null;
        foreach (var enumOption in enums) {
            if (type == null) type = enumOption.GetType();
            enumDescriptions.Add($"{Convert.ChangeType(enumOption, type.GetEnumUnderlyingType())} = {Enum.GetName(type, enumOption)}");
        }

        return $"{Environment.NewLine}{string.Join(Environment.NewLine, enumDescriptions)}";
    }
}

তারপরে এটি আপনার ConfigureServicesস্টার্টআপ.সিগুলিতে যুক্ত করুন:

c.DocumentFilter<EnumDocumentFilter>();

এনাম সরানো সম্ভব: অ্যারে [6] যা নীচে প্রদর্শিত হবে?
সফটলিয়ন

4
দুর্দান্ত সমাধান, তবে এতে থাকা এক্সটেনশনগুলি DescribeEnumParametersআমার প্রকল্পে খালি ছিল। আমি কাস্ট করার জন্য ছিল paramথেকে NonBodyParameterএবং enum পরীক্ষা সেখানে:if (param is NonBodyParameter nbParam && nbParam.Enum?.Any() == true) { param.Description += DescribeEnum(nbParam.Enum); }
Rabban

আমার প্রকল্পে এক্সটেনশানগুলিও খালি, @ রব্বান সমাধান ব্যবহার করুন।
কার্লোস ব্যাপ্পলার 12 ই

4
@ রব্বান আমি এটি অন্তর্ভুক্ত করতে আমার কোড আপডেট করেছি। আমি কি এটি সঠিক জায়গায় রেখেছি তা যাচাই করতে পারবেন? আমার এই সমস্যাটি ছিল না। হতে পারে একটি নতুন সংস্করণ জিনিস পরিবর্তন করেছে।
গ্যাব্রিয়েল লুসি

@ গ্যাব্রিয়েললুচি নিশ্চিত ও অনুমোদিত হয়েছে;)
রাব্বান

14

.NET CORE 3.1 এবং সোয়াগার 5

আপনার যদি এনামগুলিকে নির্বাচন করে স্ট্রিং হিসাবে পাস করার জন্য একটি সহজ সমাধানের প্রয়োজন হয় :

using System.Text.Json.Serialization;


[JsonConverter(typeof(JsonStringEnumConverter))]
public enum MyEnum
{
    A, B
}

দ্রষ্টব্য, আমরা System.Text.Json.Serializationনেমস্পেস ব্যবহার করি , না Newtonsoft.Json!


এইটি সঠিক মানগুলি দেখায় এবং মানগুলিকে এনামে রূপান্তর করার সময়ও কাজ করে। মনে রাখবেন যে আপনাকে নুগেট প্যাকেজ যুক্ত করতে হবে System.Text.Json
MovGP0

এটাই আমি খুঁজছিলাম! যেহেতু আমাকে কেবল একক এনামের জন্য স্ট্রিং ব্যবহার করতে DescribeAllEnumsAsStringsহবে এবং সমস্ত এনামগুলিকে স্ট্রিংয়ে রূপান্তর করবে।
নিলে

এই সহজ সমাধানের জন্য ধন্যবাদ। আমি .NET কোর 3.1 এবং সোয়াগার 5.5 ব্যবহার করছি। বর্ণনাআলইনমাস এস্ট্রিংস ব্যবহার করার দরকার নেই। এনামে সবেমাত্র [জসনকনভার্টার (টাইপফ (জসনস্ট্রিংইউনম কনভার্টার)) সেট করুন। EX: System.Text.Json.Serialization; [জসনকনভার্টর (টাইফফ (জসনস্ট্রিংইউনম কনভার্টার))] জনসাধারণের বিভাগ {অটোস, ইলেকট্রনিক্স, আসবাবপত্র, বাড়ি, পোষা প্রাণী, বিবিধ}
মহেশ

13

যদি কেউ আগ্রহী হয় আমি কোডটি সাথে কাজ করার জন্য পরিবর্তন করেছি

.NET CORE 3 এবং সোয়াগার ভি 5

    public class SwaggerAddEnumDescriptions : IDocumentFilter
{
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        // add enum descriptions to result models
        foreach (var property in swaggerDoc.Components.Schemas.Where(x => x.Value?.Enum?.Count > 0))
        {
            IList<IOpenApiAny> propertyEnums = property.Value.Enum;
            if (propertyEnums != null && propertyEnums.Count > 0)
            {
                property.Value.Description += DescribeEnum(propertyEnums, property.Key);
            }
        }

        // add enum descriptions to input parameters
        foreach (var pathItem in swaggerDoc.Paths.Values)
        {
            DescribeEnumParameters(pathItem.Operations, swaggerDoc);
        }
    }

    private void DescribeEnumParameters(IDictionary<OperationType, OpenApiOperation> operations, OpenApiDocument swaggerDoc)
    {
        if (operations != null)
        {
            foreach (var oper in operations)
            {
                foreach (var param in oper.Value.Parameters)
                {
                    var paramEnum = swaggerDoc.Components.Schemas.FirstOrDefault(x => x.Key == param.Name);
                    if (paramEnum.Value != null)
                    {
                        param.Description += DescribeEnum(paramEnum.Value.Enum, paramEnum.Key);
                    }
                }
            }
        }
    }

    private Type GetEnumTypeByName(string enumTypeName)
    {
        return AppDomain.CurrentDomain
            .GetAssemblies()
            .SelectMany(x => x.GetTypes())
            .FirstOrDefault(x => x.Name == enumTypeName);
    }

    private string DescribeEnum(IList<IOpenApiAny> enums, string proprtyTypeName)
    {
        List<string> enumDescriptions = new List<string>();
        var enumType = GetEnumTypeByName(proprtyTypeName);
        if (enumType == null)
            return null;

        foreach (OpenApiInteger enumOption in enums)
        {
            int enumInt = enumOption.Value;

            enumDescriptions.Add(string.Format("{0} = {1}", enumInt, Enum.GetName(enumType, enumInt)));
        }

        return string.Join(", ", enumDescriptions.ToArray());
    }
}

4
এটি কেবলমাত্র কাজ করে প্যারামিটার প্রকার ঠিক enum ... না nullable enum, enums ইত্যাদি সংগ্রহ সেই ক্ষেত্রে জন্য আমার উত্তর চেক করুন।
ম্যাতিস

আমি যখন এই কোডটি চালাই আমি দেখতে পেলাম যে এনামোপশনটি টাইপ করুন ওপেনপিপিস্ট্রিংয়ের বর্ণনা -ইনুমে
লোভ

4
আপনার সমাধানটি কাজ করছে, কেবলমাত্র যদি আমি GetEnumTypeByNameএই বিষয়ে ফার্স্ট অফ ডিফল্ট কন্ডিশনটি পরিবর্তন করি.FirstOrDefault(x => x.FullName == enumTypeName || x.Name == enumTypeName);
Виталиевич Виталиевич

12

এসপ নেট কোর 3 সহ

using System.Text.Json.Serialization;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
         services.AddControllers().AddJsonOptions(options =>
             options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));

তবে মনে হচ্ছে স্বশবাকল সংস্করণ 5.0.0-আরসি 4 এটি সমর্থন করার জন্য প্রস্তুত নয়। সুতরাং নিউটোনসফ্ট লাইব্রেরির মতো এটি সমর্থন ও প্রতিবিম্বিত না হওয়া পর্যন্ত আমাদের স্বশবাকল কনফিগারেশনের ফাইলটিতে একটি বিকল্প (অবমূল্যায়িত) ব্যবহার করা দরকার।

public void ConfigureServices(IServiceCollection services)
{ 
      services.AddSwaggerGen(c =>
      {
            c.DescribeAllEnumsAsStrings();

এই উত্তর এবং অন্যান্য উত্তরের মধ্যে পার্থক্যটি হল নিউটনসফটের পরিবর্তে কেবল মাইক্রোসফ্ট জেএসএন লাইব্রেরি ব্যবহার করা using


আরে @ বাশির, সেই সমর্থনের অভাবের বিষয়টি লক্ষ্য রাখার জন্য কি কোনও সোচবাকল ইস্যু আছে?
বার্নার্ড ভ্যান্ডার বেকেন

হাই @ বার্নার্ড-ভান্ডার-বেকেন, আমি এটি রিপোর্ট করিনি তবে আমি অনুমান করি সেখানে আছে। ভাল হয় যদি আমরা এটি খুঁজে পেতে পারি এবং এটি পরবর্তী পোস্টগুলির জন্য এই পোস্টে যুক্ত করতে পারি।
বশির মোমেন

4
দেখে মনে হচ্ছে এখানে: github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1269
jeremyh

6

মানগুলির সাথে এনাম স্টিংগুলির জন্য আমার বৈকল্পিক:

এখানে চিত্র বর্ণনা লিখুন

পরিষেবাদি কনফিগার করুন:

services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "web server api", Version = "v1" });
                c.SchemaFilter<EnumSchemaFilter>();
            });

ছাঁকনি:

public class EnumSchemaFilter : ISchemaFilter
    {
        public void Apply(OpenApiSchema model, SchemaFilterContext context)
        {
            if (context.Type.IsEnum)
            {
                model.Enum.Clear();
                Enum.GetNames(context.Type)
                    .ToList()
                    .ForEach(name => model.Enum.Add(new OpenApiString($"{Convert.ToInt64(Enum.Parse(context.Type, name))} - {name}")));
            }
        }
    }

4

আমি ঠিক এটি করেছি এবং এটি কাজ করে!

স্টার্টআপ.সি

services.AddSwaggerGen(c => {
  c.DescribeAllEnumsAsStrings();
});

Model.cs

public enum ColumnType {
  DATE = 0
}

swagger.json

type: {
  enum: ["DATE"],
  type: "string"
}

আমি আশা করি এটি আপনাকে কীভাবে সহায়তা করেছিল তা আপনাকে সহায়তা করে!


4
DescribeAllEnumsAsStrings
অবচয়

4

নেট কোর 3.1 এ এবং সোয়াগার 5.0.0:

using System.Linq;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace WebFramework.Swagger
{
    public class EnumSchemaFilter : ISchemaFilter
    {
        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
        {
            if (context.Type.IsEnum)
            {
                var enumValues = schema.Enum.ToArray();
                var i = 0;
                schema.Enum.Clear();
                foreach (var n in Enum.GetNames(context.Type).ToList())
                {
                    schema.Enum.Add(new OpenApiString(n + $" = {((OpenApiPrimitive<int>)enumValues[i]).Value}"));
                    i++;
                }
            }
        }
    }

}

এবং স্টার্টআপের মধ্যে:

services.AddSwaggerGen(options =>
            {
                #region  EnumDesc
                options.SchemaFilter<EnumSchemaFilter>();
                #endregion
            });

ফলাফল


4
এর নীচের দিকটি হ'ল, কোনও অনুরোধ কার্যকর করার সময়, এনাম মূল্যের কেবলমাত্র উপস্থাপনা (উদাহরণস্বরূপ 2 টি) পাস করার পরিবর্তে API একটি মান হিসাবে সম্পূর্ণ বিবরণ পাবেন (লজিকেরর = 3 এর মতো), যা হিসাবে ব্যর্থ হবে এটি এনামের জন্য বৈধ মান নয় বলে খারাপ অনুরোধ।
মতাস

3

আমি হজম রেহানীর জবাবটি পরিবর্তনযোগ্য করেছি এনাল সংগ্রহের সাথে এবং এনাম সংগ্রহের সাথেও to পূর্ববর্তী উত্তরগুলি কেবলমাত্র কোনও সম্পত্তির টাইপের মতো ঠিক নামকরণ করা হলে কাজ করে। এই সমস্ত সমস্যা নীচের কোডে সম্বোধন করা হয়।

এটি। নেট কোর 3.x এবং সোয়াগার 5.x এর সাথে কাজ করে

কিছু ক্ষেত্রে এনাম টাইপের জন্য দু'বার অনুসন্ধান না করে এটি আরও কার্যকর হতে পারে।

class SwaggerAddEnumDescriptions : IDocumentFilter
{
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        // add enum descriptions to result models
        foreach (var property in swaggerDoc.Components.Schemas.Where(x => x.Value?.Enum?.Count > 0))
        {
            IList<IOpenApiAny> propertyEnums = property.Value.Enum;
            if (propertyEnums != null && propertyEnums.Count > 0)
            {
                property.Value.Description += DescribeEnum(propertyEnums, property.Key);
            }
        }

        // add enum descriptions to input parameters
        foreach (var pathItem in swaggerDoc.Paths)
        {
            DescribeEnumParameters(pathItem.Value.Operations, swaggerDoc, context.ApiDescriptions, pathItem.Key);
        }
    }

    private void DescribeEnumParameters(IDictionary<OperationType, OpenApiOperation> operations, OpenApiDocument swaggerDoc, IEnumerable<ApiDescription> apiDescriptions, string path)
    {
        path = path.Trim('/');
        if (operations != null)
        {
            var pathDescriptions = apiDescriptions.Where(a => a.RelativePath == path);
            foreach (var oper in operations)
            {
                var operationDescription = pathDescriptions.FirstOrDefault(a => a.HttpMethod.Equals(oper.Key.ToString(), StringComparison.InvariantCultureIgnoreCase));
                foreach (var param in oper.Value.Parameters)
                {
                    var parameterDescription = operationDescription.ParameterDescriptions.FirstOrDefault(a => a.Name == param.Name);
                    if (parameterDescription != null && TryGetEnumType(parameterDescription.Type, out Type enumType))
                    {
                        var paramEnum = swaggerDoc.Components.Schemas.FirstOrDefault(x => x.Key == enumType.Name);
                        if (paramEnum.Value != null)
                        {
                            param.Description += DescribeEnum(paramEnum.Value.Enum, paramEnum.Key);
                        }
                    }
                }
            }
        }
    }

    bool TryGetEnumType(Type type, out Type enumType)
    {
        if (type.IsEnum)
        {
            enumType = type;
            return true;
        }
        else if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            var underlyingType = Nullable.GetUnderlyingType(type);
            if (underlyingType != null && underlyingType.IsEnum == true)
            {
                enumType = underlyingType;
                return true;
            }
        }
        else
        {
            Type underlyingType = GetTypeIEnumerableType(type);
            if (underlyingType != null && underlyingType.IsEnum)
            {
                enumType = underlyingType;
                return true;
            }
            else
            {
                var interfaces = type.GetInterfaces();
                foreach (var interfaceType in interfaces)
                {
                    underlyingType = GetTypeIEnumerableType(interfaceType);
                    if (underlyingType != null && underlyingType.IsEnum)
                    {
                        enumType = underlyingType;
                        return true;
                    }
                }
            }
        }

        enumType = null;
        return false;
    }

    Type GetTypeIEnumerableType(Type type)
    {
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        {
            var underlyingType = type.GetGenericArguments()[0];
            if (underlyingType.IsEnum)
            {
                return underlyingType;
            }
        }

        return null;
    }

    private Type GetEnumTypeByName(string enumTypeName)
    {
        return AppDomain.CurrentDomain
            .GetAssemblies()
            .SelectMany(x => x.GetTypes())
            .FirstOrDefault(x => x.Name == enumTypeName);
    }

    private string DescribeEnum(IList<IOpenApiAny> enums, string proprtyTypeName)
    {
        List<string> enumDescriptions = new List<string>();
        var enumType = GetEnumTypeByName(proprtyTypeName);
        if (enumType == null)
            return null;

        foreach (OpenApiInteger enumOption in enums)
        {
            int enumInt = enumOption.Value;

            enumDescriptions.Add(string.Format("{0} = {1}", enumInt, Enum.GetName(enumType, enumInt)));
        }

        return string.Join(", ", enumDescriptions.ToArray());
    }
}

ফিল্টারটি c.DocumentFilter<SwaggerAddEnumDescriptions>();swagger কনফিগারেশন এ যুক্ত করতে ব্যবহার করুন Startup.cs


3

মানক ওপেনপিআইআই দিয়ে এটি সম্ভব নয়। এনামগুলি কেবল তাদের স্ট্রিংয়ের মান সহ বর্ণিত হয়।

ভাগ্যক্রমে আপনি এটি কিছু অ-মানক এক্সটেনশানগুলি দিয়ে করতে পারেন যা আপনার ক্লায়েন্ট জেনারেটর দ্বারা ব্যবহৃত হয়।

এনএসওয়াগ সমর্থন করে x-enumNames

অটোরেস্ট সমর্থন করে x-ms-enum

ওপেনপি-জেনারেটর সমর্থন করে x-enum-varnames

অন্যান্য জেনারেটরগুলি এই এক্সটেনশনের একটিটিকে সমর্থন করতে পারে বা তাদের নিজস্ব থাকতে পারে।

x-enumNamesএনএসওয়াগের জন্য উত্পন্ন করতে নিম্নলিখিত স্কিমা ফিল্টারটি তৈরি করুন:

public class EnumSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (context.Type.IsEnum)
        {
            var array = new OpenApiArray();
            array.AddRange(Enum.GetNames(context.Type).Select(n => new OpenApiString(n)));
            // NSwag
            schema.Extensions.Add("x-enumNames", array);
            // Openapi-generator
            schema.Extensions.Add("x-enum-varnames", array);
        }
    }
}

এবং এটি হিসাবে নিবন্ধন করুন:

services.AddSwaggerGen(options =>
{
    options.SchemaFilter<EnumSchemaFilter>();
});

2

স্টার্টআপ.এস এর ভিতরে কোড লিখুন

services.AddSwaggerGen(c => {
      c.DescribeAllEnumsAsStrings();
    });

4
এই বিকল্পটি স্বশবাকলে অবমূল্যায়ন করা হয়েছে। এটিএসপি.এনইটি কোর বিকল্পটি ব্যবহার করার পরামর্শ দেওয়া হয় এবং তারপরে স্বশবাকল সেটিকে প্রতিফলিত করতে পারে।
বশির মোমেন

2

আমি এখানে সুন্দর কাজ পেয়েছি:

@ পাওলোভিটার - এটি শেমা ফিল্টার ব্যবহার করে এটি সমাধান করুন:

public class EnumSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema model, SchemaFilterContext context)
    {
        if (context.Type.IsEnum)
        {
            model.Enum.Clear();
            Enum.GetNames(context.Type)
                .ToList()
                .ForEach(n => model.Enum.Add(new OpenApiString(n)));
            }
        }
    }
}

এবং স্টার্টআপের মধ্যে:

services.AddSwaggerGen(options =>
{
    options.SchemaFilter<EnumSchemaFilter>();
}

আপনার এটিও নিশ্চিত করা উচিত যে আপনি সাধারণভাবে যেমনটি আপডেট model.Formatহন "string"তেমন আপডেট করেন "int32"
lsuarez

2

আপনি যদি newtonsof.json ব্যবহার করছেন তবে এটি ব্যবহার করুন

using Newtonsoft.Json.Converters;


[JsonConverter(typeof(StringEnumConverter))]
public enum MyEnum
{
    A, B
}

আপনি যদি System.Text.Json.Serialization ব্যবহার করছেন

using System.Text.Json.Serialization;


[JsonConverter(typeof(JsonStringEnumConverter))]
public enum MyEnum
{
    A, B
}

1

। নেট কোর 3.0

   using Newtonsoft.Json.Converters;

 services
    .AddMvc(options =>
    {
     options.EnableEndpointRouting = false;
     })
    .AddNewtonsoftJson(options => options.SerializerSettings.Converters.Add(new StringEnumConverter()))

4
এটি নতুন এসপনেট কোর জেএসওএন সিরিয়ালাইজের পরিবর্তে নিউটনসফট ব্যবহার করছে।
বশির মোমেন

1

যদি সোয়াগারের সংস্করণটি 5.5.x হয়, তবে আপনার প্রয়োজন:

  1. ইনস্টল করুন: ইনস্টল করুন-প্যাকেজ Swashbuckle.AspNetCore.Newtonsoft-সংস্করণ 5.5.0

  2. পরিষেবাদি.এডসস্বাগারজেন নিউটোনসফটসপোর্ট ();

তথ্যসূত্র: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#systemtextjson-stj-vs-newtonsoft


এটি আমার পক্ষে কাজ করেছে। যদি আপনি আপনার এএসপিএন কোর প্রকল্পে নিউটনসফট জসন ব্যবহার করছেন। আপনার এই স্পষ্টভাবে প্রয়োজন। ধন্যবাদ @ ব্যবহারকারী 30844147
আঙুলগুলি 10

0

এএসপি নেট সলিউশন

আমার এপিআই ডক্সে সম্পত্তিটি চিহ্নিত করা সত্ত্বেও একটি এনাম এখনও ইন্ট হিসাবে দেখানো হয়েছিল StringEnumConverter। উপরে উল্লিখিত সমস্ত এনামের জন্য আমরা বিশ্বব্যাপী সেটিংস ব্যবহার করতে পারিনি। সোয়াগারকনফাইগে এই লাইনটি যুক্ত করা সমস্যার সমাধান করেছে:

c.MapType<ContactInfoType>(() => new Schema { type = "string", @enum = Enum.GetNames(typeof(ContactInfoType))});

0

আমরা যা খুঁজছিলাম তার জন্য অন্যান্য উত্তরে আমি বেশ কয়েকটি ত্রুটিগুলি পেয়েছি, তাই আমি ভেবেছিলাম যে আমি এটি আমার নিজের সরবরাহ করব। আমরা System.Text.Json এর সাথে এএসপি.নেট কোর 3.1 ব্যবহার করছি, তবে আমাদের ব্যবহারটি JSON সিরিয়ালাইজড নির্বিশেষে কাজ করে।

আমাদের লক্ষ্য ছিল এএসপি.নেট কোর এপিআই উভয়টিতে নিম্ন-উট-কেসড এনাম স্ট্রিং মানগুলি গ্রহণ করার পাশাপাশি সোয়াগার-তে একই নথির। আমরা বর্তমানে ব্যবহার করছেন [DataContract]এবং [EnumMember], তাই পদ্ধতির যে জুড়ে বোর্ড EnumMember মান সম্পত্তি এবং ব্যবহার থেকে ছোট হাতের উট-cased মান নিতে হয়।

আমাদের নমুনা এনাম:

[DataContract]
public class enum Colors
{
  [EnumMember(Value="brightPink")]
  BrightPink,
  [EnumMember(Value="blue")]
  Blue
}

আমরা স্বশবাকলে এনামমেম্বার মানগুলি নীচের মত একটি ইস্কেমা ফিল্টার ব্যবহার করে ব্যবহার করব:

public class DescribeEnumMemberValues : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (context.Type.IsEnum)
        {
            schema.Enum.Clear();

            //Retrieve each of the values decorated with an EnumMember attribute
            foreach (var member in context.Type.GetMembers())
            {
                var memberAttr = member.GetCustomAttributes(typeof(EnumMemberAttribute), false).FirstOrDefault();
                if (memberAttr != null)
                {
                    var attr = (EnumMemberAttribute) memberAttr;
                    schema.Enum.Add(new OpenApiString(attr.Value));
                }
            }
        }
    }
}

এই নামকরণ প্রকল্পটি এএসপি.নেট কোর-এও ব্যবহৃত হয়েছে তা নিশ্চিত করতে আমরা একটি তৃতীয় পক্ষের নুগেট প্যাকেজ (গিটহাব রেপো ) ব্যবহার করছি। এটির সাথে কনফিগার সার্ভিসগুলির মধ্যে স্টার্টআপ.সিগুলিতে কনফিগার করুন:

services.AddControllers()
  .AddJsonOptions(opt => opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverterWithAttributeSupport()));

অবশেষে, আমাদের স্বশবাকলিতে আমাদের ইসকেমা ফিল্টারটি নিবন্ধিত করতে হবে, সুতরাং কনফিগার সার্ভিসগুলিতে নিম্নলিখিতগুলিও যুক্ত করুন ():

services.AddSwaggerGen(c => {
  c.SchemaFilter<DescribeEnumMemberValues>();
});

GetMembers()যেমন ভাল হবে GetMembers(BindingFlags.Static | BindingFlags.Public)যেমন "ব্লু" হিসাবে শুধুমাত্র প্রকৃত ঘোষিত enum বৈশিষ্ট্য সীমা। আমি সদস্যটিকে ফেরত দিতে "অন্য" কেসটিও রূপান্তরিত করেছিলাম। নামটির কোনও [EnumMember]বৈশিষ্ট্য না থাকলে নাম ame
ব্যবহারকারীর 2864740
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.