Разбор JSON DateTime от JSON Serializer от Newtonsoft

Я сериализовал объект, используя сериализатор JSON Newtonsoft, и DateTime прошел через:

/Date(1237588418563+0000)/ 

Когда я $ .evalJSON () на этом, это объект, но я не могу найти никаких обычных методов Date, таких как toUTCString.

Любые идеи, что я могу с этим сделать?

Используйте один из JsonConverters, который поставляется с Json.NET для работы с датами, чтобы получить лучший формат. JavaScriptDateTimeConverter автоматически предоставит вам дату JavaScript.

 public class LogEntry { public string Details { get; set; } public DateTime LogDate { get; set; } } [Test] public void WriteJsonDates() { LogEntry entry = new LogEntry { LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc), Details = "Application started." }; string defaultJson = JsonConvert.SerializeObject(entry); // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"} string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter()); // {"Details":"Application started.","LogDate":new Date(1234656000000)} string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter()); // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"} } 

Документация: Сериализация дат в JSON с помощью Json.NET

Я придумал другой подход, который может быть полезен для некоторых. В основном я создаю свой собственный CustomDateConverter, который я вызываю, когда мне это нужно. Преобразователь принимает 2 параметра, формат даты, например, yyyy-MM-dd HH:mm:ss и TimeZoneInfo, что позволяет мне конвертировать дату с UTC в часовой пояс пользователя:

 public class JSONCustomDateConverter : DateTimeConverterBase { private TimeZoneInfo _timeZoneInfo; private string _dateFormat; public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo) { _dateFormat = dateFormat; _timeZoneInfo = timeZoneInfo; } public override bool CanConvert(Type objectType) { return objectType == typeof(DateTime); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat)); writer.Flush(); } 

Вы можете использовать его следующим образом:

  var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } }); 

Очевидно, что вы можете удалить что-либо, связанное с часовым поясом, если требуется только форматирование пользовательских дат. Позвольте мне знать, что помогло!

Начиная с версии Newtonsoft Json.Net версии 4.5r5 вы используете class classа JsonPropertyAttribute и устанавливаете свойство Свойство ItemConverterType. Применение:

 // class to be serialized public class MyClass { [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))] public DateTime? DateTime1; public DateTime? DateTime2; } 

Как я заметил, это установит DateTimeConverter для всех свойств этого classа, а не только тот, который был объявлен.

Иди в ту же проблему и нашел решение, основанное на ссылке от Адама:

 new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0)); 

Он похож на временную метку Unix, которую javascript легко конвертирует в объект даты. The- - 0 – просто заставить javascript рассматривать вывод substr как целое число … Я думаю, вы могли бы Number() его также, если вам не нравятся взгляды - 0

Объект JSON содержал что-то вроде этого:

 var data = {"CreatedDate":"/Date(1327572000000-1000)/"}); /// var oddDateTimeZone = data.CreatedDate; var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13); var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4); var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone))); 

но, тем не менее, было бы лучше исправить объект JSON, чтобы функция даты срабатывала, не используя что-то вроде eval () или window []. Возможно, в jQuery. Не уверен.

Не забывайте, что смещение может быть + и не просто - для смещения!

Извините, я немного упростил @James Newton-King

 string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now); 
 ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

Это работает для меня

  • Как разбирать данные JSON с помощью jQuery / JavaScript?
  • Использование API даты и времени Joda для анализа нескольких форматов
  • Почему JSON недействителен, если целое число начинается с 0
  • Java: значение parse int из char
  • Как разбирать строку запроса в NameValueCollection в .NET.
  • Как преобразовать / разобрать из String в char в java?
  • Как анализировать уличный / почтовый адрес свободной формы из текста и в компоненты
  • Инкрементный анализ JSON в C #
  • повысить параметры семантического действия духа
  • Анализ содержимого HTML в VBA
  • Разбор массива JSON в java.util.List с Gson
  • Давайте будем гением компьютера.