c# - .NET-স্ট্রিং হিসাবে enum এর JSON serialization




asp.net enums (15)

আমার একটি শ্রেণী রয়েছে যা একটি enum সম্পত্তি রয়েছে এবং JavaScriptSerializer সেরিয়ালাইজার ব্যবহার JavaScriptSerializer বস্তুর ক্রমবর্ধমান উপর, আমার জসন ফলাফলের তার string "নাম" এর পরিবর্তে গণনার পূর্ণসংখ্যা মান রয়েছে। আমার জসন একটি string হিসাবে একটি কাস্টম JavaScriptConverter তৈরি ছাড়া enum পেতে একটি উপায় আছে কি? সম্ভবত একটি বৈশিষ্ট্য আছে যা আমি enum সংজ্ঞা, বা বস্তুর সম্পত্তি, সঙ্গে সজ্জিত করতে পারে?

একটি উদাহরণ হিসাবে:

enum Gender { Male, Female }

class Person
{
    int Age { get; set; }
    Gender Gender { get; set; }
}

পছন্দসই জসন ফলাফল:

{ "Age": 35, "Gender": "Male" }

@ ইগি উত্তর CSS # এনমের JSON সিরিয়ালাইজেশন শুধুমাত্র ASP.NET (ওয়েব API এবং তাই) এর জন্য স্ট্রিং হিসাবে সেট করে।

তবে এটি এড হক সিরিয়ালাইজেশনের সাথে কাজ করতে, আপনার স্টার্ট ক্লাসে (যেমন Global.asax অ্যাপ্লিকেশন_স্টার্ট) অনুসরণ করুন

//convert Enums to Strings (instead of Integer) globally
JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter { CamelCaseText = true });
    return settings;
});

Json.NET পৃষ্ঠায় আরও তথ্য

উপরন্তু, আপনার enum সদস্য নির্দিষ্ট টেক্সট থেকে সিরিয়ালাইজ / deserialize করার জন্য, ব্যবহার করুন

System.Runtime.Serialization.EnumMember

বৈশিষ্ট্য, এই মত:

public enum time_zone_enum
{
    [EnumMember(Value = "Europe/London")] 
    EuropeLondon,

    [EnumMember(Value = "US/Alaska")] 
    USAlaska
}

ASP.NET কোর উপায়:

public class Startup
{
  public IServiceProvider ConfigureServices(IServiceCollection services)
  {
    services.AddMvc().AddJsonOptions(options =>
    {
      options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
    });
  }
}

https://gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e


আপনি JsonConverter এট্রিবিউট ব্যবহার করতে চান না তবে আপনি আপনার JsonSerializer একটি রূপান্তরকারী যুক্ত করতে পারেন:

string SerializedResponse = JsonConvert.SerializeObject(
     objToSerialize, 
     new Newtonsoft.Json.Converters.StringEnumConverter()
); 

এটা যে সিরিয়ালাইজেশনের সময় দেখায় প্রতি enum জন্য কাজ করবে।


আপনি JsonCerializer সেটিংসটি JsonConverter.SerializeObject এ কল সহ তৈরি করতে পারেন:

var result = JsonConvert.SerializeObject
            (
                dataObject,
                new JsonSerializerSettings
                {
                    Converters = new [] {new StringEnumConverter()}
                }
            );

আমি খুঁজে পেয়েছি যে Json.NET একটি StringEnumConverter বৈশিষ্ট্য সহ আমি যে সঠিক কার্যকারিতা খুঁজছেন তা প্রদান করে:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }

StringEnumConverter ডকুমেন্টেশন পাওয়া যায় আরো বিস্তারিত।


একটি বিবরণ বৈশিষ্ট্য আছে যখন serialization জন্য কোন উত্তর নেই যে লক্ষ্য।

এখানে আমার প্রয়োগকরণ যা বর্ণনা বৈশিষ্ট্যটি সমর্থন করে।

public class CustomStringEnumConverter : Newtonsoft.Json.Converters.StringEnumConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Type type = value.GetType() as Type;

        if (!type.IsEnum) throw new InvalidOperationException("Only type Enum is supported");
        foreach (var field in type.GetFields())
        {
            if (field.Name == value.ToString())
            {
                var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                writer.WriteValue(attribute != null ? attribute.Description : field.Name);

                return;
            }
        }

        throw new ArgumentException("Enum not found");
    }
}

Enum:

public enum FooEnum
{
    // Will be serialized as "Not Applicable"
    [Description("Not Applicable")]
    NotApplicable,

    // Will be serialized as "Applicable"
    Applicable
}

ব্যবহার:

[JsonConverter(typeof(CustomStringEnumConverter))]
public FooEnum test { get; set; }

এখানে একটি সরল সমাধান যা একটি সার্ভার-পার্শ্ব C # enum JSON এ সিরিয়ালাইজ করে এবং একটি ক্লায়েন্ট-পার্শ্ব <select> উপাদানটি তৈরি করতে ফলাফলটি ব্যবহার করে। এই সহজ enums এবং বিটফ্ল্যাফ enums উভয় জন্য কাজ করে।

আমি শেষ থেকে শেষ সমাধানটি অন্তর্ভুক্ত করেছি কারণ আমার মনে হয় বেশিরভাগ লোকেরা JSON এ C # enum সিরিয়াল করতে চায়, সম্ভবত এটি <select> ড্রপ-ডাউনটি পূরণ করতে এটি ব্যবহার করবে।

এখানে যায়:

উদাহরণ Enum

public enum Role
{
    None = Permission.None,
    Guest = Permission.Browse,
    Reader = Permission.Browse| Permission.Help ,
    Manager = Permission.Browse | Permission.Help | Permission.Customise
}

অনুমতি সিস্টেম তৈরি করার জন্য বিটwise ORs ব্যবহার করে একটি জটিল enum। সুতরাং আপনি enum এর পূর্ণসংখ্যা মান জন্য [0,1,2 ..] সাধারণ সূচক উপর নির্ভর করতে পারবেন না।

সার্ভার সাইড - সি #

Get["/roles"] = _ =>
{
    var type = typeof(Role);
    var data = Enum
        .GetNames(type)
        .Select(name => new 
            {
                Id = (int)Enum.Parse(type, name), 
                Name = name 
            })
        .ToArray();

    return Response.AsJson(data);
};

উপরের কোডটি পান অনুরোধটি পরিচালনা করতে ন্যান্সিএফএক্স ফ্রেমওয়ার্ক ব্যবহার করে। এটি ন্যান্সির Response.AsJson() সহায়ক পদ্ধতি ব্যবহার করে - তবে চিন্তা করবেন না, আপনি কোনও স্ট্যান্ডার্ড JSON ফরম্যাট ব্যবহার করতে পারেন কারণ এনম ইতিমধ্যে সিরিয়ালাইজেশনের জন্য প্রস্তুত একটি সাধারণ বেনামী টাইপের মধ্যে উপস্থাপিত হয়েছে।

উত্পাদিত JSON

[
    {"Id":0,"Name":"None"},
    {"Id":2097155,"Name":"Guest"},
    {"Id":2916367,"Name":"Reader"},
    {"Id":4186095,"Name":"Manager"}
]

ক্লায়েন্ট সাইড - CoffeeScript

fillSelect=(id, url, selectedValue=0)->
    $select = $ id
    $option = (item)-> $ "<option/>", 
        {
            value:"#{item.Id}"
            html:"#{item.Name}"
            selected:"selected" if item.Id is selectedValue
        }
    $.getJSON(url).done (data)->$option(item).appendTo $select for item in data

$ ->
    fillSelect "#role", "/roles", 2916367

এইচটিএমএল আগে

<select id="role" name="role"></select>

এইচটিএমএল পরে

<select id="role" name="role">
    <option value="0">None</option>
    <option value="2097155">Guest</option>
    <option value="2916367" selected="selected">Reader</option>
    <option value="4186095">Manager</option>
</select>

এটি একটি পুরানো প্রশ্ন কিন্তু আমি মনে করি আমি শুধু ক্ষেত্রে অবদান চাই। আমার প্রোজেক্টগুলিতে আমি কোনও জসনের অনুরোধের জন্য আলাদা মডেল ব্যবহার করি। একটি মডেল সাধারণত "জসন" উপসর্গের সাথে ডোমেন অবজেক্টের মতো একই নাম থাকবে। মডেল AutoMapper ব্যবহার করে ম্যাপ করা হয় । জেসন মডেল একটি স্ট্রিং সম্পত্তি ঘোষণা করে যা ডোমেন ক্লাসে একটি enum হয়, AutoMapper এটির স্ট্রিং উপস্থাপনাটির সমাধান করবে।

আপনি যদি বিস্মিত হন, তবে জেসন সিরিয়ালাইজড শ্রেণীর জন্য আলাদা মডেল দরকার কারণ অন্তর্নির্মিত সিরিয়ালাইজারটি অন্যথায় বৃত্তাকার রেফারেন্সগুলির সাথে আসে।

এই কেউ সাহায্য করে আশা করি।


ওমর বোখারী এবং উরির উত্তরগুলির সমন্বয়টি আমার সমাধানগুলি যেভাবে আমি প্রদান করতে চাই তার থেকে আমার সমাধানটি সাধারনত আমার enum তে যা কিছু আছে তার থেকে আলাদা, বিশেষ করে আমি যদি আমার প্রয়োজন হয় তবে আমি আমার enums পরিবর্তন করতে সক্ষম হতে চাই।

তাই যদি কেউ আগ্রহী হয় তবে এটি এমন কিছু।

public enum Gender
{
   [EnumMember(Value = "male")] 
   Male,
   [EnumMember(Value = "female")] 
   Female
}

class Person
{
    int Age { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    Gender Gender { get; set; }
}

না আপনি ব্যবহার করতে পারেন কোন বিশেষ বৈশিষ্ট্য আছে। JavaScriptSerializer enums তাদের সাংখ্যিক মান এবং তাদের স্ট্রিং উপস্থাপনা না enums serializes। আপনি সংখ্যাসূচক মান পরিবর্তে enum serialize সিরিয়াল enum ব্যবহার করতে হবে।

সম্পাদন: @ ওমরখখারী JSON.net দ্বারা নির্দেশিত এই ব্যবহার ক্ষেত্রে (বৈশিষ্ট্যটি [JsonConverter(typeof(StringEnumConverter))] মাধ্যমে [JsonConverter(typeof(StringEnumConverter))] ) এবং আরও অনেকে নির্মিত। নেট সিরিয়ালাইজারগুলির দ্বারা পরিচালিত নয়। এখানে serializers এর বৈশিষ্ট্য এবং কার্যকারিতা তুলনা একটি লিঙ্ক


বিল্ট-ইন জাভাস্ক্রিপ্ট সেরিয়ালাইজারের সাথে এটি সম্পন্ন করতে আপনি আসলে একটি JavaScriptConverter ব্যবহার করতে পারেন। আপনার enum একটি Uri রূপান্তর দ্বারা আপনি একটি স্ট্রিং হিসাবে এনকোড করতে পারেন।

আমি তারিখের জন্য এটি কিভাবে করতে হবে তা বর্ণনা করেছি তবে এটি enums এর জন্যও ব্যবহার করা যেতে পারে।

http://blog.calyptus.eu/seb/2011/12/custom-datetime-json-serialization/


যে কেউ উপরের অপর্যাপ্ত খুঁজে পায়, আমি এই overload সঙ্গে বসতি স্থাপন শেষ:

JsonConvert.SerializeObject(objToSerialize, Formatting.Indented, new Newtonsoft.Json.Converters.StringEnumConverter())

স্ট্রিং হিসাবে c # enum এর JSON সিরিয়ালাইজেশনের জন্য আপনার global.asax এ নীচের যোগ করুন

  HttpConfiguration config = GlobalConfiguration.Configuration;
            config.Formatters.JsonFormatter.SerializerSettings.Formatting =
                Newtonsoft.Json.Formatting.Indented;

            config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());

Gender প্রোপার্টটিতে একটি ScriptIgnore বৈশিষ্ট্য যোগ করে এটি সহজে সম্পন্ন করা হয়, এটি ScriptIgnore করা হয় না এবং Gender GenderString সম্পত্তি যুক্ত করে যা সিরিয়ালাইজ করে:

class Person
{
    int Age { get; set; }

    [ScriptIgnore]
    Gender Gender { get; set; }

    string GenderString { get { return Gender.ToString(); } }
}

new JavaScriptSerializer().Serialize(  
    (from p   
    in (new List<Person>() {  
        new Person()  
        {  
            Age = 35,  
            Gender = Gender.Male  
        }  
    })  
    select new { Age =p.Age, Gender=p.Gender.ToString() }  
    ).ToArray()[0]  
);




javascriptserializer