2014-10-22 2 views
2

Я извлекаю данные из 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, хотя я еще не проверял), является единственной ошибкой десериализации.

ответ

2

Сериализатор Microsoft Json (и результирующий десериализатор Json в JavaScript) преобразует значения в UTC, даже если вы задаете время как UTC на сервере при настройке переменной. У меня была эта проблема в последнее время, и это привело к тому, что я с ума сошел, поскольку это происходит только при возврате данных с сервера, а не при отправке с JavaScript. В конце концов мне пришлось преобразовать дату в строку перед возвратом к клиенту, а затем использовать библиотеку momentjs, чтобы преобразовать ее в дату и время. Тогда все отлично сработало.

public class EventResult : Result 
{ 
    ... 

    public DateTime StartDate { get; set; } 

    public string StartDateString { get {return StartDate.ToString() } }; 

    ... 
} 

Тогда в ваших JS:

var startDate = moment(Results.Results[0].StartDateString) 
+0

Это на самом деле все в моем коде, у вас есть какие-либо идеи, что метод будет в C#? Я изменил тип StartDate на строку, и теперь получаю правильные строки даты в своих десериализованных результатах, но я попытался сделать var startDate = DateTime.Parse (ev.StartDate), и он снова дал мне эту неправильную дату. –

+0

Nevermind Я понял; это StartDate = DateTimeOffset.Parse (ev.StartDate) .UtcDateTime; –

+0

Рад, что вы это поняли. Удачи. – tlbignerd

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