2012-11-08 4 views
6

Próbuję deserializowania następującą odpowiedź JSON (używając Json.NET):Używając [JsonProperty], aby dopasować parametry JSON do właściwości klasy C#, które są typu Lista

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

na obiekty tego typu:

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; } 
    } 

Jak używać atrybutu [JsonProperty] podczas tworzenia listy? (Zakładając, że nazwy parametrów Json zawarte na tej Liście to "0" do "9"). Spędziłem ostatnie kilka godzin próbując różnych metod bez żadnego szczęścia.

Dziękujemy

Odpowiedz

7

Jednym rozwiązaniem byłoby zrobić coś takiego (wziąłem [JsonProperty("0")] off polloptions pierwszy):

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(); 

Pierwszym krokiem jest deserializowania jak za normalny - to będzie dbać każdej własności z wyjątkiem polloptions. Następnym krokiem jest deserializacja do JContainer, abyśmy mogli uzyskać indywidualne tokeny i utworzyć listę z nazwami o numerycznych nazwach (stąd int.TryParse(p.Name, out option)).

Co to daje jako lista wypełniona wartościami Tak/Nie. Jeśli byłoby również jak nazwami opcji ankiety, a także wartości, rozważ to:

Zmiana polloptions nieruchomość do:

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

Gdzie PollOption jest:

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

Podczas deserializacji :

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

Twoja odpowiedź jest bardzo szczegółowa. Spróbuję to teraz zaimplementować. Dziękuję Ci! – Bataleon

+0

Zamiast Gdzie (x => x jako T) można użyć OfType () –

Powiązane problemy