Разбор информации о дате JSON в C # DateTime - PullRequest
9 голосов
/ 11 февраля 2011

У меня есть служба WCF, которая возвращает объект CLR.Этот объект определяется следующим образом:

[DataContract]
public class Person
{
  [DataMember]
  public string FullName
  {
    get { return fullName; }
    set { id = fullName; }
  }
  private string fullName = string.Empty;

  [DataMember]
  public DateTime BirthDate
  {
    get { return birthDate; }
    set { birthDate = value; }
  }
}

Экземпляры этого объекта создаются и возвращаются из моей службы WCF.Этот сервис выглядит следующим образом:

[OperationContract]
[WebGet(UriTemplate = "/GetPersonByID/{id}", ResponseFormat = WebMessageFormat.Json)]
public Person GetPersonByID(string id)
{
  Person person = FindPersonByID(id);
  return person;
}

Когда я получаю ответ обратно в свое приложение, я могу успешно извлечь значение FullName.Однако мне не удалось преобразовать BirthDate в объект C # DateTime в моем клиентском приложении.При преобразовании в строку BirthDate выглядит примерно так:

\/Date(1297367252340-0500)\/

Как мне передать это в экземпляр C # DateTime?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 11 февраля 2011

Вот два варианта:

Вы можете использовать метод десериализации из System.Web.Script.Serialization.JavaScriptSerializer (в System.Web.Extensions.dll).

или вы можете использовать метод ReadObject из System.Runtime.Serialization.Json.DataContractJsonSerializer (в System.Runtime.Serialization.dll или в .NET 3.5 в System.ServiceModel.Web.dll).

Убедитесь, что ваша дата заключена в кавычки, такие как:

string dateString = @"""\/Date(1297367252340-0500)\/""";
4 голосов
/ 28 февраля 2011

Причина даты в этом странном формате в том, что DateTime является примитивом в WCF.К сожалению, универсального стандартизированного формата для сериализации даты и времени в JSON не существует - различные фреймворки используют различные строковые форматы.

Дилемма заключается в том, что WCF необходимо изначально понимать, что конкретная строка в проводе действительно является DateTime, а не просто простой ванильной строкой JSON.Отсюда и странный формат.Как только DataContractJsonSerializer встречает дату, начинающуюся с \ / Date, он начинает пытаться проанализировать ее как дату.

Теперь, чтобы ответить на ваш вопрос, когда вы отправляете DateTime по сети, это зависит от того,вы используете клиент веб-браузера, клиент Silverlight или клиент WCF.

У клиента WCF или клиента Silverlight 2+ с этим НЕ должно быть проблем - они должны автоматически использовать DataContractJsoNSerializer иесли они не используют его, вы можете подключить DCJS вручную.

Если вы используете веб-клиент, вы можете включить файл .js, который поставляется с ASP.NET AJAX (я думаю, что он называется MicrosoftAspNetAjax.js или MicrosoftAjax.cs, хотя название могло измениться).Его функция десериализации также автоматически разбирает эти даты.

Надеюсь, это поможет!

3 голосов
/ 07 декабря 2013

Что ж, в последнее время мне приходилось работать над проектом приложения для Android Mobile (Xamarin Studio), где я не смог использовать Newtonsoft Json (Json.NET) из-за ошибок, возникающих при развертывании на эту конкретную версию устройства (Android API 16 Версия 4.2.1).

К счастью, я нашел альтернативную библиотеку для json (System.Json).Однако в этой библиотеке нет способа неявного приведения даты JSON в C # DateTime.

Я создал следующие две функции для обнуляемых преобразований даты и даты из строковой даты json (т.е. / Date (1389435240000 + 0000)/)

Код можно улучшить, но пока он работает

public static DateTime? ConvertToNallableDate(string date)
        {

            DateTime? val = null;
            /*          /Date(1389435240000+0000)/*/
            try{
                if(!string.IsNullOrEmpty(date))
                {
                    date = date.Replace ("/Date(", string.Empty).Replace (")/", string.Empty);
                    int pIndex = date.IndexOf ("+");
                    if(pIndex < 0) pIndex = date.IndexOf("-");
                    long millisec = 0;
                    date = date.Remove (pIndex);
                    long.TryParse (date, out millisec);
                    System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-GB");
                    DateTime newDate = DateTime.Parse ("1970,1,1", ci);
                    newDate = newDate.AddMilliseconds(millisec);
                    val = newDate == null ? (DateTime?)null : newDate;

                }
            }catch {
                val = null;
            }
            return val;
        }

        public static DateTime ConvertToDate(string date)
        {

            DateTime val = new DateTime();
            /*/Date(1389435240000+0000)/*/
            try{
            if(!string.IsNullOrEmpty(date))
            {
                date = date.Replace ("/Date(", string.Empty).Replace (")/", string.Empty);
                int pIndex = date.IndexOf ("+");
                if(pIndex < 0) pIndex = date.IndexOf("-");
                long millisec = 0;
                date = date.Remove (pIndex);
                long.TryParse (date, out millisec);
                System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-GB");
                DateTime newDate = DateTime.Parse ("1970,1,1", ci);
                val = newDate.AddMilliseconds(millisec);

            }
            }catch {
                val = new DateTime();
            }
            return val;
        }
1 голос
/ 29 ноября 2012

Это решило мою проблему

using System.Web.Script.Serialization;


//code
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
DateTime ddate = json_serializer.Deserialize<DateTime>(@"""\/Date(1326038400000)\/""").ToLocalTime();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...