0

目前,我正在尝试将 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
  }
}

现在,我创建了一个“VisitsSummary”类型,我想将 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);
4

1 回答 1

0

好的,问题似乎是由于 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 中的空数组有更简洁的解决方案,我将不胜感激。

¡ 谢天谢地!

于 2012-05-31T08:40:06.577 回答