Использование [JsonProperty] для сопоставления параметров Json со свойствами класса C#, которые являются списком типов

Я пытаюсь десериализовать следующий ответ Json (используя Json.NET):

[{"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"). Я провел последние несколько часов, пробуя разные методы, но безуспешно.

большое спасибо

1 ответов


одним из вариантов было бы сделать что-то вроде этого (я взял [JsonProperty("0")] выкл polloptions first):

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. Следующий шаг-десериализоваться в JContainer чтобы мы могли добраться до отдельных токенов и создать список из тех, у которых есть числовые имена (следовательно,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; }
}

при десериализации:

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