使用[JsonProperty]将Json参数与类型为List的C#类属性相匹配

Bat*_*eon 7 c# json json.net

我正在尝试反序列化以下Json响应(使用Json.NET):

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

进入这种类型的对象:

    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; }
    }
Run Code Online (Sandbox Code Playgroud)

[JsonProperty]创建List时如何使用该属性?(假设要包含在此List中的Json参数名称为"0"到"9").我花了最后几个小时尝试不同的方法,没有任何运气.

非常感谢

nic*_*k_w 8

一种选择是做这样的事情(我先[JsonProperty("0")]取消了polloptions):

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();
Run Code Online (Sandbox Code Playgroud)

第一步是按照正常情况反序列化 - 这将照顾除了的所有属性polloptions.下一步是反序列化为a,JContainer以便我们可以获取单个标记并从具有数字名称的列表中创建列表(因此int.TryParse(p.Name, out option)).

这会给你一个填充了yes/no值的列表.如果您还想要轮询选项的名称以及值,请考虑以下事项:

polloptions属性更改为:

public List<PollOption> polloptions { get; set; }
Run Code Online (Sandbox Code Playgroud)

在哪里PollOption:

class PollOption
{
    public int Name { get; set; }
    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

反序列化时:

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();
Run Code Online (Sandbox Code Playgroud)