我正在尝试反序列化以下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; }
}
创建List时如何使用[JsonProperty]
属性? (假设要包含在此List中的Json参数名称为“0”到“9”)。我花了最后几个小时尝试不同的方法而没有任何运气。
非常感谢
答案 0 :(得分: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();
第一步是按照正常情况反序列化 - 这将处理除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();