Я извлекаю данные из Solr в свой код, чтобы получить список событий. Результаты, которые я получаю отформатирован так:DateTimes deserializing wrong: JsonConvert возвращает неправильные даты
public class SearchResults<T> where T : Result
{
public SearchResults()
{
Results = new List<T>();
}
public IEnumerable<T> Results { get; set; }
public int Total { get; set; }
public IEnumerable<FacetField> FacetFields { get; set; }
}
так что я получаю список результатов, общее количество и список facetfields. Список результатов в этом случае список EventResults:
public class EventResult : Result
{
public string Location { get; set; }
public string DisplayDate { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public string Time { get; set; }
public string ImageUrl { get; set; }
public string WebsiteUrl { get; set; }
public string WebsiteText { get; set; }
public string CustomUrl { get; set; }
public string CustomUrlText { get; set; }
public string Description { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }
public IEnumerable<string> TaxonomyTypes { get; set; }
public IEnumerable<string> TaxonomyTypesId { get; set; }
public IEnumerable<string> TaxonomyTopics { get; set; }
public IEnumerable<string> TaxonomyTopicsId { get; set; }
public IEnumerable<string> TaxonomyLocations { get; set; }
public IEnumerable<string> TaxonomyLocationsId { get; set; }
public override void Load(XElement data)
{
}
}
и это мой код ...
using (StreamReader sr = new StreamReader(stream))
{
var responseData = sr.ReadToEnd();
// added for testing
var startdate = responseData.Substring((responseData.IndexOf("StartDate") + 12), ((responseData.IndexOf("EndDate")-3) - (responseData.IndexOf("StartDate") + 12)));
var Results = JsonConvert.DeserializeObject<SearchResults<EventResult>>(responseData);
.....
}
Я положил в поиске, который будет возвращать ровно один случай для простоты, так responseData содержит только одно событие в результатах. Когда я смотрю на сырье responseData во время отладки, это выглядит следующим образом:
{"Results":[{"Location":"Online","DisplayDate":"Jul 23, 2014","StartDate":"2014-07-23T00:00:00Z","EndDate":"2014-07-25T00:00:00Z","Time":"","Speakers":"","ImageUrl":"","WebsiteUrl":"","WebsiteText":"","CustomUrl":"","CustomUrlText":"","Description":"","Latitude":"","Longitude":"","TaxonomyTypes":[],"TaxonomyTypesId":[],"TaxonomyTopics":[],"TaxonomyTopicsId":[],"TaxonomyLocations":[],"TaxonomyLocationsId":[],"Id":"768","Title":"MFin Online Chat - 12:00 p.m.","Source":{"doc":{"str":[{"@name":"id","#text":"event_768"},{"@name":"s_eventId","#text":"768"},{"@name":"s_contact"},{"@name":"t_contact"},{"@name":"s_description"},{"@name":"t_description"},{"@name":"s_dateDisplay","#text":"Jul 23, 2014"},{"@name":"s_location","#text":"Online"},{"@name":"t_location","#text":"Online"},{"@name":"s_name","#text":"MFin Online Chat - 12:00 p.m."},{"@name":"t_name","#text":"MFin Online Chat - 12:00 p.m."},{"@name":"s_openTo"},{"@name":"t_openTo"},{"@name":"s_sponsors"},{"@name":"t_sponsors"},{"@name":"s_time"},{"@name":"s_latitude"},{"@name":"s_longitude"},{"@name":"s_speakers"},{"@name":"t_speakers"},{"@name":"s_customUrlText"},{"@name":"s_customUrl"},{"@name":"s_imageUrl"},{"@name":"s_websiteText"},{"@name":"s_websiteUrl"},{"@name":"t_taxonomy_topics"},{"@name":"t_taxonomy_types"},{"@name":"t_taxonomy_locations"},{"@name":"s_type","#text":"Event"},{"@name":"s_folderId","#text":"101"}],"arr":{"@name":"text","str":[null,null,"Online","MFin Online Chat - 12:00 p.m.",null,null,null,null,null,null]},"date":[{"@name":"dt_startDate","#text":"2014-07-23T00:00:00Z"},{"@name":"dt_endDate","#text":"2014-07-25T00:00:00Z"}],"long":{"@name":"_version_","#text":"1482239673606602769"}}}}],"Total":1,"FacetFields":[{"Name":"mv_taxonomy_topics","Values":[]},{"Name":"mv_taxonomy_topicsId","Values":[]},{"Name":"mv_taxonomy_types","Values":[]},{"Name":"mv_taxonomy_typesId","Values":[]},{"Name":"mv_taxonomy_locations","Values":[]},{"Name":"mv_taxonomy_locationsId","Values":[]}]}
Там очень много, но главное, что StartDate установлена в 2014-07-23T00: 00: 00Z или 23 июля 2014. В данных есть два значения StartDate, но они одинаковы. Чтобы дважды проверить, я добавил строку, чтобы вытащить StartDate с помощью подстроки, и, конечно же, var startdate = 2014-07-23T00: 00: 00Z
Однако на следующей строке, когда я проверяю результаты (десериализованный объект, возвращаемый JsonConvert), то одно событие в Results.Results имеет неправильную дату начала:
Results.Results[0].StartDate = 7/22/2014 8:00:00 PM
это, кажется, делает это последовательно; в каждом найденном мной поиске все результаты, которые я проверил, имели дату начала на один день раньше, чем StartDate в responseData.
Я не могу показаться, что вы входите в метод JsonConvert.DeserializeObject, поэтому я не уверен, как отладить эту проблему; это тот шаг, когда все идет не так, и я понятия не имею, в чем проблема. StartDate (и, вероятно, EndDate, хотя я еще не проверял), является единственной ошибкой десериализации.
Это на самом деле все в моем коде, у вас есть какие-либо идеи, что метод будет в C#? Я изменил тип StartDate на строку, и теперь получаю правильные строки даты в своих десериализованных результатах, но я попытался сделать var startDate = DateTime.Parse (ev.StartDate), и он снова дал мне эту неправильную дату. –
Nevermind Я понял; это StartDate = DateTimeOffset.Parse (ev.StartDate) .UtcDateTime; –
Рад, что вы это поняли. Удачи. – tlbignerd