目前,我正在尝试将Piwik API的结果解析为C#对象列表。但是,Json 的格式化方式实际上不允许我这样做。
我从 Piwik API 获取以下数据(示例数据):
{ "2012-05-27" : [ ],
"2012-05-28" : [ ],
"2012-05-29" : { "avg_time_on_site" : 309,
"bounce_count" : 1,
"bounce_rate" : "33%",
"max_actions" : 36,
"nb_actions" : 72,
"nb_actions_per_visit" : 24,
"nb_uniq_visitors" : 2,
"nb_visits" : 3,
"sum_visit_length" : 928
},
"2012-05-30" : { "avg_time_on_site" : 263,
"bounce_rate" : "0%",
"max_actions" : 37,
"nb_actions" : 70,
"nb_actions_per_visit" : 23.300000000000001,
"nb_uniq_visitors" : 3,
"nb_visits" : 3,
"sum_visit_length" : 788
}
}
现在,我创建了一个"访问摘要"类型,我想在每个日期"内"将 Jason 投射到该类型:
public class VisitsSummaryResult
{
[JsonProperty("nb_uniq_visitors")]
public int NumUniqueVisitors { get; set; }
[JsonProperty("nb_visits")]
public int NumVisits { get; set; }
[JsonProperty("nb_actions")]
public int NumActions { get; set; }
[JsonProperty("nb_visits_converted")]
public int NumVisitsConverted { get; set; }
[JsonProperty("bounce_count")]
public int BounceCount { get; set; }
[JsonProperty("sum_visit_length")]
public int SumVisitLength { get; set; }
[JsonProperty("max_actions")]
public int MaxActions { get; set; }
[JsonProperty("bounce_rate")]
public string BounceRate { get; set; }
[JsonProperty("nb_actions_per_visit")]
public double NumActionsPerVisit { get; set; }
[JsonProperty("avg_time_on_site")]
public int AverageTimeOnSite { get; set; }
}
但是,由于数据是使用数组中的日期格式化的,因此我无法 Json.NET 理解它应该将其视为数组。这有意义吗?
此外,最好自动告诉 Json.NET 将日期解析为 VisitsSummaryResult 的属性 - 这是否可能?然后我可以将"VisitsSummaryResult.Date"添加到类中,以将其很好地包装到一个对象中。
目前,我只能考虑自己预解析 Json,然后将各个 Json 代码段传递给 Json.NET 以转换为 C# 对象 - 但这还不是最佳的。
有人会指出如何解决这个问题吗?
谢谢!
编辑:我也尝试使用通用字典来获取Key->Value(Date->VisitsSummaryResult),但无济于事。
JsonConvert.DeserializeObject<Dictionary<string, VisitsSummaryResult>>(e.Result);
好的,似乎问题是由于 Json 数组中有一些空条目,这会引发反序列化。
因此,我能解决这个问题的唯一方法是以下(肮脏的)解决方案,将空数组反序列化为 null,将其他所有内容反序列化为我自己的类型:
Dictionary<string, VisitsSummaryResult> myObjList = new Dictionary<string, VisitsSummaryResult>();
Dictionary<string, object> values = JsonConvert.DeserializeObject<Dictionary<string, object>>(e.Result);
foreach (KeyValuePair<string, object> pair in values)
{
try
{
myObjList.Add(pair.Key, JsonConvert.DeserializeObject<VisitsSummaryResult>(pair.Value.ToString())); // Getting the raw, inner Json string
}
catch (Exception ex)
{
myObjList.Add(pair.Key, null); // Exception: insert null
}
}
如果有人对如何处理 Json.NET 中的空数组有更干净的解决方案,我将不胜感激。
谢谢!