सभी Enums को StringEnumConverter को लागू करने के लिए विश्व स्तर पर Json.Net को कैसे बताएं


84

मैं उनके स्ट्रिंग प्रतिनिधित्व और json.net के साथ इसके विपरीत गणना करना चाहते हैं। जिस तरह से मैं इसे लागू करने के लिए रूपरेखा को बताने के लिए पता लगा सकता हूं, वह StringEnumConverterइस तरह से गुणों को व्याख्या करना है:

[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }

हालाँकि, मेरे उपयोग के मामले में, json.net को विश्व स्तर पर कॉन्फ़िगर करने के लिए यह अधिक सुविधाजनक होगा StringEnumConverter, ताकि अतिरिक्त एनोटेशन की आवश्यकता के बिना सभी एन्यूमरेशंस (डी) का उपयोग करके क्रमबद्ध किया जा सके ।

क्या ऐसा करने का कोई तरीका है, जैसे कस्टम की मदद से JsonSerializerSettings?

जवाबों:


113

एक जोड़े StringEnumConverterके लिए JsonSerializerSettingsकन्वर्टर्स संग्रह।

प्रलेखन: JsonConverters के साथ सीरियल


यदि आप चाहते हैं कि धारावाहिक निर्माता ऊंट का उपयोग करें, तो आप इसे भी सेट कर सकते हैं:

SerializerSettings.Converters.Add(
    new StringEnumConverter { CamelCaseText = true });

यह क्रमानुसार जाएगा SomeValueकरने के लिए someValue


मैंने इसे अपने Global.asax.cs पर स्थापित करने की कोशिश की, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsलेकिन काम नहीं किया। किसी भी विचार क्यों हो सकता है?
आमोद

क्या क्षेत्र के नाम को कम करने का कोई तरीका है? CamelCaseText ध्वज को कक्षा में हार्ड-कोड किया गया है और मुझे एक अलग आवरण रणनीति का उपयोग करने का तरीका नहीं दिखता है।
mikebridge

@mikebridge क्या आपने इसका कोई हल ढूंढा है? इसके अलावा प्रत्येक एनुम विकल्प के लिए नाम स्वयं निर्धारित करने के तरीके की तलाश में (या लोअरकेस का उपयोग करें)।
Timm

1
@ टिम्म हाँ, मैंने इस पोस्ट का उपयोग किया: stackoverflow.com/questions/6288660/…
mikebridge

@ मायकेब्रिज धन्यवाद। मैंने पाया कि [EnumMember (मान = "अपरिभाषित")] प्रति enum प्रविष्टि JSON.Net के साथ ठीक काम करती है (हालांकि Microsoft के JSON डेज़राइज़र द्वारा असमर्थित)
Timm

40

अन्य उत्तर ASP.NET के लिए काम करते हैं, लेकिन यदि आप इन सेटिंग्स को आम तौर पर किसी भी संदर्भ में JsonConvert को कॉल करने के लिए सेट करना चाहते हैं:

JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
    return settings;
});

( Http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data देखें )


2
मैं क्या देख रहा था! और भी छोटा:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
कपे

तुमने मुझे बचाया! धन्यवाद भाई! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
paqogomez

18

अपने Global.asax.cs में जोड़ें

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());

यह समाधान WebAPI क्रमांकन के लिए पूरी तरह से काम करता है। धन्यवाद!
चार्ली

5

ASP.NET Core 2 के लिए निम्न कार्य करें:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.Converters.Add(new StringEnumConverter());
                });

        ...

कृपया ध्यान दें कि यह services.AddJsonOptions(...)MVC पर टैग नहीं होना चाहिए, क्योंकि आप MVC के लिए सेटिंग बना रहे हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.