2011-11-20 18 views
12

के साथ एक साधारण JSON सरणी को Deserializing मुझे यकीन है कि यह सवाल बार-बार पूछा गया है, लेकिन किसी कारण से, मैं अभी भी इसे काम करने के लिए प्रबंधित नहीं कर सकता।DataContractJsonSerializer

मैं एक JSON ऑब्जेक्ट को deserialize करना चाहता हूं जिसमें एक सदस्य होता है; एक स्ट्रिंग सरणी:

{"results" : ["a", "b"]} 

इस वर्ग है कि मैं में deserialize करने के लिए कोशिश कर रहा हूँ है:

public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

और यह deserialize विधि है:

private static T Deserialize<T>(string json) 
{ 
    var instance = Activator.CreateInstance<T>(); 
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var serializer = new DataContractJsonSerializer(instance.GetType()); 
     return (T)serializer.ReadObject(ms); 
    } 
} 

Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}") की तरह एक कॉल है Whatever का प्रारंभिक उदाहरण लौटा रहा है लेकिन Results सरणी null रह रहा है।

Whatever की संरचना के साथ कुछ गड़बड़ है?

+11

आप 'वर उदाहरण = Activator.CreateInstance () जरूरत नहीं है,' 'का उपयोग typeof (टी)' –

उत्तर

12

आह, मुझे एहसास हुआ कि इस पोस्ट करने के बाद कि मैं Whatever पर DataContract विशेषता सजावट याद आ रही थी:

[DataContract] 
public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

अब यह ठीक काम करता है।

+6

धन्यवाद। डेटा सदस्यों के केस संवेदनशील के नामों को मैप करना भी महत्वपूर्ण है। आपने ऐसा किया है, हालांकि अगर कोई डेटाकंट्रैक्ट और डेटामेम्बर का उपयोग करने का प्रयास करता है तो मैं इसे तनाव देना चाहता हूं, लेकिन नाम विशेषता को भूल जाता हूं (जैसा कि मैंने पहली बार किया है)। – cudahead

+1

आप कमाल हैं !! –

8

मुझे पता है, पोस्ट काफी प्रतिबंधित है; लेकिन: क्लास-ऑब्जेक्ट्स की सूची को सीधे वापस करने के लिए भी संभव है, अगर आपको डेटासलास से जुड़ने के लिए जानकारी की जेसनर्रे-स्ट्रिंग मिलती है; यानी .:

List<SomeDataClass> filesToMove = new List<SomeDataClass>(); 

public T deserializeJSON<T>(string json) 
{ 
    var instance = typeof(T); 
    var lst = new List<SomeDataClass>(); 

    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var deserializer = new DataContractJsonSerializer(instance); 
     return (T)deserializer.ReadObject(ms); 
    } 
} 

someJsonArrayString = "[{\"ID\":7},{\"ID\":16}]"; 
filesToMove = deserializeJSON<List<SomeDataClass>>(someJsonArrayString); 
Console.WriteLine(filesToMove[1].ID); // returns 16 
dataclass SomeDataClass.cs साथ

:

[DataContract] 
class SomeDataClass 
{ 
    [DataMember] 
    public int ID { get; set; }   
} 
+0

सूची के साथ क्या, आपका उदाहरण काम नहीं करता है जैसे आपने इसे पोस्ट किया है। – Sebastian

संबंधित मुद्दे