Я столкнулся с этой самой проблемой при разработке Twitterizer. Проблема в том, что набор данных не относится к традиционному объектно-ориентированному дизайну.
Если бы вы отобразили это как объекты, вы бы увидели:
object root
int as_of
object trends
array[object] <date value of as_of>
string query
string name
Как видите, у объекта тренда есть свойство, имя которого меняется. Название основано на значении даты as_of. Как таковой, он не может быть автоматически десериализован.
Моим первым решением было использование System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject (). Этот метод возвращает иерархию слабо типизированных вложенных экземпляров словаря. Затем я сам прошел через результаты.
internal static TwitterTrendTimeframe ConvertWeakTrend(object value)
{
Dictionary<string, object> valueDictionary = (Dictionary<string, object>)value;
DateTime date = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds((int)valueDictionary["as_of"]);
object[] trends = (object[])((Dictionary<string, object>)valueDictionary["trends"])[date.ToString("yyyy-MM-dd HH:mm:ss")];
TwitterTrendTimeframe convertedResult = new TwitterTrendTimeframe()
{
EffectiveDate = date,
Trends = new Collection<TwitterTrend>()
};
for (int i = 0; i < trends.Length; i++)
{
Dictionary<string, object> item = (Dictionary<string, object>)trends[i];
TwitterTrend trend = new TwitterTrend()
{
Name = (string)item["name"]
};
if (item.ContainsKey("url"))
{
trend.Address = (string)item["url"];
}
if (item.ContainsKey("query"))
{
trend.SearchQuery = (string)item["query"];
}
convertedResult.Trends.Add(trend);
}
return convertedResult;
}
Это ужасно, но это сработало.
С тех пор я принял использование Json.NET за его скорость и простоту.