2012-11-08 12 views
6

あるC#クラスのプロパティにJSONパラメータを一致させるために[JsonProperty]使用:この種類のオブジェクトに私は(Json.NETを使用して)、次のJSONレスポンスをデシリアライズしようとしているタイプの一覧

[{"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]属性を使用するにはどうすればよいですか? (このリストに含まれるJsonパラメータ名が "0"から "9"であると仮定します)。私は最後の数時間を別の方法で試してみました。 - これは、世話をする

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

最初のステップは、通常通りデシリアライズすることです:一つの選択肢は、この(私はpolloptions最初のオフ[JsonProperty("0")]を取った)のような何かをするだろう

感謝

答えて

7

polloptionsを除くすべてのプロパティの次のステップは、JContainerにデシリアライズして、個々のトークンを取得し、数値名のリストからリストを作成することです(したがってint.TryParse(p.Name, out option))。

これにより、yes/no値が入力されたリストが表示されます。デシリアライズするとき

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

変更polloptionsプロパティへ:

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

PollOptionである場合、あなたはまた、投票の選択肢だけでなく、値の名前のように、このことを検討する場合:

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

OfType(x => xはT)の代わりにOfType ()を使用できます。 –

関連する問題