2012-11-08 17 views
6

मैं निम्नलिखित Json प्रतिक्रिया (Json.NET का प्रयोग करके) deserialize करने के लिए कोशिश कर रहा हूँ कर रहे हैं करने के लिए Json मानकों से मेल करने के [JsonProperty] का उपयोग करना:सी # वर्ग गुण किस प्रकार सूची

[{"pollid":"1", "question":"This is a test", "start":"2011-06-28", "end":"2012-03-21", "category":"Roads", "0":"Yes", "1":"No"} … ] 

इस प्रकार की वस्तुओं में:

class Poll 
    { 
     [JsonProperty("pollid")] 
     public int pollid { get; set; } 
     [JsonProperty("question")] 
     public string question { get; set; } 
     [JsonProperty("start")] 
     public DateTime start { get; set; } 
     [JsonProperty("end")] 
     public DateTime end { get; set; } 
     [JsonProperty("category")] 
     public string category { get; set; } 

     // PROBLEM AREA 
     [JsonProperty("0")] // Json parameter names are 0 to 9. How can I 'match' these to the List elements? 
     public List<string> polloptions { get; set; } 
    } 

मैं सूची बनाते समय [JsonProperty] विशेषता का उपयोग कैसे करूं? (इस सूची में निहित जेसन पैरामीटर नामों को मानना ​​"0" से "9" है)। मैंने पिछले कुछ घंटों को बिना किसी किस्मत के विभिन्न तरीकों का प्रयास किया है।

बहुत धन्यवाद

उत्तर

7

एक विकल्प इस तरह कुछ करने के लिए किया जाएगा (मैं [JsonProperty("0")]polloptions पहले दूर ले गया):

int option; 
Poll poll = JsonConvert.DeserializeObject<Poll>(json); 
JContainer container = (JContainer)JsonConvert.DeserializeObject(json); 

poll.polloptions = container.Where(t => t as JProperty != null) 
    .Cast<JProperty>().Where(p => int.TryParse(p.Name, out option)) 
    .Select(p => p.Value.Value<string>()).ToList(); 

पहला कदम सामान्य के अनुसार deserialize करने के लिए है - ध्यान इस ले जाएगा polloptions को छोड़कर प्रत्येक संपत्ति का। अगला चरण JContainer को deserialize करना है ताकि हम व्यक्तिगत टोकन पर जा सकें और संख्यात्मक नाम वाले लोगों की सूची बना सकें (इसलिए int.TryParse(p.Name, out option))।

यह आपको हां/नहीं मानों के साथ पॉप्युलेट की एक सूची के रूप में देगा।

बदलें polloptions संपत्ति के लिए:

public List<PollOption> polloptions { get; set; } 

कहाँ PollOption है: यदि आप भी जनमत विकल्प के साथ-साथ मूल्यों के नाम की तरह, इस पर विचार करेंगे

class PollOption 
{ 
    public int Name { get; set; } 
    public string Value { get; set; } 
} 

जब deserializing :

Poll poll = JsonConvert.DeserializeObject<Poll>(json); 
JContainer container = (JContainer)JsonConvert.DeserializeObject(json); 

var pollOptionNames = container.Where(t => t as JProperty != null) 
    .Cast<JProperty>().Where(p => int.TryParse(p.Name, out option)) 
    .Select(p => int.Parse(p.Name)).ToList(); 

var pollOptionValues = container.Where(t => t as JProperty != null) 
    .Cast<JProperty>().Where(p => int.TryParse(p.Name, out option)) 
    .Select(p => p.Value.Value<string>()).ToList(); 

poll.polloptions = pollOptionNames.Select((n, i) => 
    new PollOption() { Name = n, Value = pollOptionValues[i] }).ToList(); 
+0

आपका उत्तर बेहद विस्तृत है। मैं इसे अभी लागू करने की कोशिश करूंगा। धन्यवाद! – Bataleon

+0

कहां (x => x के रूप में टी) के बजाय आप ऑफ टाइप () का उपयोग कर सकते हैं –

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