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」タイプを作成しました。

   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 に理解させることができません。それは理にかなっていますか?

さらに、日付をVisitsSummaryResult のプロパティに解析するように Json.NET に自動的に指示するとよいでしょう。次に、「VisitsSummaryResult.Date」をクラスに追加して、すべてを 1 つのオブジェクトに適切にラップすることができます。

現在、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 に答える