Использование [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();