我正在尝试反序列化以下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").我花了最后几个小时尝试不同的方法,没有任何运气.
非常感谢
一种选择是做这样的事情(我先[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)