2012-11-08 2 views
6
Liste Typ sind

Ich versuche, die folgende Json Antwort (mit Json.NET) deserialisieren:mit [JsonProperty] Json Parameter C# Klasseneigenschaften entsprechen, die

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

in Objekte dieser Art:

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

Wie würde ich das Attribut [JsonProperty] beim Erstellen einer Liste verwenden? (Angenommen, die JSON-Parameternamen, die in dieser Liste enthalten sein sollen, sind "0" bis "9"). Ich habe die letzten paar Stunden damit verbracht, verschiedene Methoden ohne Glück auszuprobieren.

Vielen Dank

Antwort

7

Eine Möglichkeit, so etwas zu tun wäre (ich nahm die [JsonProperty("0")] aus polloptions zuerst):

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

Der erste Schritt ist wie für normale deserialisieren - diese Sorge nehmen von jeder Eigenschaft außer polloptions. Der nächste Schritt besteht in der Deserialisierung auf JContainer, so dass wir die einzelnen Token aufrufen und eine Liste mit numerischen Namen erstellen können (daher die int.TryParse(p.Name, out option)).

Was dies Ihnen als eine Liste mit den Ja/Nein-Werten geben wird. Wenn auch Sie als auch die Werte der Antwortmöglichkeiten wie die Namen würden, bedenken Sie:

Ändern der polloptions Eigenschaft auf:

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

Wo PollOption ist:

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

Wenn Deserialisieren :

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

Ihre Antwort ist sehr detailliert. Ich werde versuchen, es jetzt zu implementieren. Vielen Dank! – Bataleon

+0

Anstelle von Where (x => x als T) können Sie OfType () verwenden –

Verwandte Themen