2012-05-30 35 views
0

目前,我試圖從Piwik API解析結果到C#對象列表。然而,Json格式化的方式並不能讓我做到這一點。處理「Malformated」數組

我正在從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」型,而我要「內」每個日期鑄傑森:

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#對象 - 但這並不理想。

有沒有人有一個關於如何解決這個問題的指針? Gracias!

¡

編輯:我也試過用泛型字典來獲取Key-> Value(Date-> VisitsSummaryResult),但無濟於事。

JsonConvert.DeserializeObject<Dictionary<string, VisitsSummaryResult>>(e.Result); 

回答

0

好吧,它好像這個問題是由於這樣的事實,有JSON數組,這引發斷deserialisation在一些空項。

所以,我可以解決這個問題的唯一辦法,就是下面(髒)解決方案,以deserialise空數組爲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中的空數組,我真的很感激。 Gracias!

¡