2014-07-01 7 views
17

का उपयोग कर कॉम्प्लेक्स कुंजी के साथ शब्दकोश को क्रमबद्ध करने में सक्षम नहीं है। मेरे पास एक कस्टम .net के साथ एक शब्दकोश है जो इसकी कुंजी के रूप में टाइप है। मैं JSON.net का उपयोग करके इस शब्दकोश को जेएसओएन में क्रमबद्ध करने की कोशिश कर रहा हूं, हालांकि यह कुंजी को कनवर्ट करने में सक्षम नहीं है सीरियलाइजेशन के दौरान उचित मूल्य।Json.net

class ListBaseClass 
{ 
    public String testA; 
    public String testB; 
} 
----- 
var details = new Dictionary<ListBaseClass, string>(); 
details.Add(new ListBaseClass { testA = "Hello", testB = "World" }, "Normal"); 
var results = Newtonsoft.Json.JsonConvert.SerializeObject(details); 
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<ListBaseClass, string>> results); 

यह मुझे दो -> "{\" JSonSerialization.ListBaseClass \ ": \" सामान्य \ "}"

लेकिन अगर मैं शब्दकोश में मूल्य के रूप में अपने कस्टम प्रकार है यह अच्छी तरह से काम करता है

var details = new Dictionary<string, ListBaseClass>(); 
    details.Add("Normal", new ListBaseClass { testA = "Hello", testB = "World" }); 
    var results = Newtonsoft.Json.JsonConvert.SerializeObject(details); 
    var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, ListBaseClass>>(results); 

यह मुझे दो -> "{\" सामान्य \ ": {\" टेस्टा \ ": \" हैलो \ ", \" testB \ ": \" दुनिया \ "}}"

क्या कोई सुझाव दे सकता है कि मैं जेसननेट की कुछ सीमा मार रहा हूं या मैं कुछ गलत कर रहा हूं?

उत्तर

14

Serialization Guide राज्यों (देखें अनुभाग: शब्दकोश और hashtables; लिंक के लिए @Shashwat धन्यवाद):

जब एक शब्दकोश serializing, शब्दकोश की चाबी तार करने के लिए परिवर्तित और JSON के रूप में इस्तेमाल कर रहे हैं ऑब्जेक्ट संपत्ति के नाम। कुंजी के लिए लिखे गए स्ट्रिंग को कुंजी प्रकार के लिए या टाइपकॉन्टर लागू करके ToString() को ओवरराइड करके अनुकूलित किया जा सकता है। एक टाइप कनवर्टर एक शब्दकोश को deserializing जब एक कस्टम स्ट्रिंग को फिर से परिवर्तित करने का समर्थन करेगा।

मैं कैसे माइक्रोसॉफ्ट के पर इस तरह के एक प्रकार कनवर्टर को लागू करने के लिए एक उपयोगी उदाहरण मिला "कैसे-करें" पेज:

  • Implement a Type Converter (देखने के लिए अनुवाद के लिए खंड प्रकार कन्वर्टर्स)। MyClass वर्ग घोषणा करने के लिए विशेषता[TypeConverter(typeof(MyClassConverter))] जोड़ने

    bool CanConvertFrom(ITypeDescriptorContext context, Type source); 
    
    object ConvertFrom(ITypeDescriptorContext context, 
            System.Globalization.CultureInfo culture, object value); 
    
    object ConvertTo(ITypeDescriptorContext context, 
           System.Globalization.CultureInfo culture, 
           object value, Type destinationType); 
    

    यह भी जरूरी हो गया था:

अनिवार्य रूप से, मैं System.ComponentModel.TypeConverter का विस्तार करने और ओवरराइड करने के लिए की जरूरत है।

इन जगहों के साथ, मैं स्वचालित रूप से शब्दकोष को क्रमबद्ध और deserialize करने में सक्षम था

+0

यह जटिल शब्दकोश कुंजी के साथ किसी समस्या को हल करने के लिए हमारे लिए काम करता है। जहां क्लास घोंसले में विभिन्न ठोस कार्यान्वयन के साथ एक सामान्य वर्ग का उपयोग किया जा रहा था, हमारे कस्टम जेसन कनवर्टर जटिल कुंजी वर्ग पर घोषणात्मक विशेषता का उपयोग करके काम नहीं करते थे - हमें इसे 'जेसन कन्वर्ट.रियललाइज ऑब्जेक्ट' के लिए एक तर्क के रूप में पास करना पड़ा, जो काम करता था लेकिन कम वांछनीय था। – mungflesh

+0

मुझे यह भी एक जटिल शब्दकोश कुंजी प्रकार के लिए काम कर रहा है। दूसरों के लिए नोट - यह JSON.Net पैकेज में JSONTypeConverter सामान से स्वतंत्र है। इसके अलावा, कोई JSON सेटिंग्स नहीं थीं जिसके लिए इसका उपयोग करने की आवश्यकता थी। इस जवाब में वास्तव में वही है जो आपको करने की ज़रूरत है। मुझे शुरुआत में अतिरंजित कार्यों के अंदर ब्रेकपॉइंट्स को उपयोगी बनाने के लिए उपयोगी पाया गया था, जब उन्हें इस्तेमाल किया गया था और उन्हें क्या करने के लिए कहा गया था, तो बेहतर समझ हासिल करने के लिए। – DaveInCaz

+0

ग्रेट उत्तर, भले ही यह मेरे लिए काम नहीं करता है, क्योंकि मैं विंडोज फोन 8.1 का उपयोग कर रहा हूं, जहां System.ComponentModel.TypeConverter समर्थित नहीं है। – user3141326