处理"Malformated"数组



目前,我正在尝试将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 中的空数组有更干净的解决方案,我将不胜感激。

谢谢!

相关内容

  • 没有找到相关文章

最新更新