2012-05-30 2 views
0

В настоящее время я пытаюсь проанализировать результаты API Piwik на список объектов C#. Однако способ форматирования Json на самом деле не позволяет мне это делать.Работа с массивами «Malformated»

Я получаю следующие данные из API Piwik (данные выборок):

{ "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!

EDIT: Я также попробовал его с помощью общего словаря, чтобы получить Key-> Value (Date-> VisitsSummaryResult), но безрезультатно.

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

ответ

0

Хорошо, это кажется, что проблема связана с тем, что есть некоторые пустые записи в массиве Json, который скидывает десериализацию.

Таким образом, единственный способ, которым я мог бы решить эту проблему, заключается в следующем (загрязнено) решении deserialise пустых массивов нуля, и все остальное к моему собственному типу:

 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!

Смежные вопросы