2013-10-22 9 views
26

Json.Net का उपयोग करके वैश्विक जेसन कनवर्टर को वैश्विक रूप से पंजीकृत करना, मेरे पास मेरी ऑब्जेक्ट्स में गुण हैं जिन्हें उन्हें क्रमबद्ध/deserialize करने के लिए विशेष देखभाल की आवश्यकता है। JsonConverter के वंश को बनाना, मैं इसे सफलतापूर्वक पूरा करने में कामयाब रहा। यह ऐसा करने का आम तरीका है:Json.Net

public class SomeConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     ... 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     ... 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     ... 
    } 
} 

class SomeClass 
{ 
    [JsonProperty, JsonConverter(typeof(SomeConverter))] 
    public SomeType SomeProperty; 
} 

//Later on, in code somewhere 
SomeClass SomeObject = new SomeClass(); 
string json = JsonConvert.SerializeObject(SomeObject, new SomeConverter()); 

इस कोड के साथ मेरी समस्या यह है कि मैं हर क्रमांकन/deserialization में अपने कस्टम कनवर्टर शुरू करने की जरूरत है। मेरे प्रोजेक्ट में कई मामले हैं जो मैं ऐसा नहीं कर सकता। उदाहरण के लिए, मैं अन्य बाहरी परियोजनाओं का उपयोग कर रहा हूं जो जेसन.Net का भी उपयोग करते हैं और वे मेरे SomeClass उदाहरणों पर काम करेंगे। लेकिन चूंकि मैं अपने कोड में बदलाव नहीं करना चाहता या नहीं कर सकता, इसलिए मेरे कनवर्टर को पेश करने का कोई तरीका नहीं है।

क्या कोई तरीका है कि मैं अपने कनवर्टर को पंजीकृत कर सकता हूं, शायद static सदस्य का उपयोग जेसननेट में कर सकता हूं, इससे कोई फर्क नहीं पड़ता कि धारावाहिक/deserialization होता है, मेरा कनवर्टर हमेशा मौजूद है?

उत्तर

46

हां, यह Json.Net 5.0.5 या बाद में उपयोग करना संभव है। JsonConvert.DefaultSettings देखें। (उल्लेख जो एक @Brian से अधिक प्राथमिकता में जीत जाता है इसके बाद के संस्करण)

var config = GlobalConfiguration.Configuration; 
var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings; 
jsonSettings.Converters.Add(new SomeConverter()); 
+0

धन्यवाद एक लाख, आप मेरा दिन :) – Mehran

+0

बनाया है अगर मैं App_Start में यह कर() घटना मैं asp.net वेब एपीआई में कोई त्रुटि मिलती है । कहते हैं 'विधि नहीं मिली:' शून्य न्यूटॉन्सॉफ्ट.जेसन.जेसनकॉनवर्ट.सेट_DefaultSettings' –

+0

@DonnyV। आप शायद JSON.NET के पुराने संस्करण का उपयोग कर रहे हैं - यह अभी भी वर्जन रीडायरेक्ट्स के कारण संकलित है जो web.config में जोड़े गए हैं। – BrainSlugs83

13

एक और दृष्टिकोण के लिए है:

JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
{ 
    Converters = new List<JsonConverter> { new SomeConverter() } 
}; 

// Later on... 
string json = JsonConvert.SerializeObject(someObject); // this will use SomeConverter 

आप वेब एपीआई का उपयोग कर रहे हैं, तो आप ऊपर एक कनवर्टर विश्व स्तर पर इस तरह के बजाय सेट कर सकते हैं एक कस्टम अनुबंध समाधानकर्ता

JsonFormatter.SerializerSettings.ContractResolver = new CustomContractResolver(); 

को लागू करने और कार्यान्वयन नहीं बल्कि सीधा है

public class CustomContractResolver : DefaultContractResolver 
{ 
    private static readonly JsonConverter _converter = new MyCustomConverter(); 
    private static Type _type = typeof (MyCustomType); 

    protected override JsonConverter ResolveContractConverter(Type objectType) 
    { 
     if (objectType == null || !_type.IsAssignableFrom(objectType)) // alternatively _type == objectType 
     { 
      return base.ResolveContractConverter(objectType); 
     } 

     return _converter; 
    } 
} 

दोनों ही तरीकों से मान्य हैं, यह एक बस एक बड़ा हथौड़ा

+0

हम्म, 'जेसनफॉर्मेटर' अब मौजूद नहीं है? – GregaMohorko

+0

यह वेबएपीआई 2.x में करता है, आप किस ढांचे में काम कर रहे हैं? एमवीसी कोर? वहां आपके पास एक JsonInputFormatter और JsonOutputFormatter –

+0

.NET Framework 4.6.1 है। मुझे मिली एकमात्र चीज़ 'JsonConvert.DefaultSettings' है जो' JsonSerializerSettings' प्रकार है और इसमें 'ContractResolver' प्रॉपर्टी है, लेकिन फिर यह दृष्टिकोण @Brian से एक से अलग नहीं है। – GregaMohorko