Разбор JSON DateTime от Newtonsoft JSON Serializer
Я сериализую объект с использованием сериализатора Newtonsoft JSON, а DateTime прошел через:
/Date(1237588418563+0000)/
Когда я $.evalJSON() на этом, это объект, но я не могу найти на нем никаких обычных методов Date, таких как toUTCString.
Любые идеи, что я могу с этим сделать?
Ответы
Ответ 1
Используйте один из 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
Ответ 2
Как и в версии Newtonsoft Json.Net версии 4.5r5, вы используете класс класса JsonPropertyAttribute и задаете свойство Свойство ItemConverterType.
Использование:
// class to be serialized
public class MyClass
{
[JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
public DateTime? DateTime1;
public DateTime? DateTime2;
}
Как я уже заметил, это установит DateTimeConverter для всех свойств этого класса, а не только тот, который был объявлен.
Ответ 3
Я придумал другой подход, который может быть полезен для некоторых. В основном я создаю свой собственный 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<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });
Очевидно, что вы можете удалить что-либо, связанное с часовым поясом, если требуется только форматирование пользовательских дат. Позвольте мне знать, что помогло!
Ответ 4
Ran в ту же проблему и нашел решение на основе ссылки от Адама:
new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));
Он похож на временную метку Unix, которую javascript легко конвертирует в объект даты. - 0
состоит в том, чтобы сделать javascript обработкой вывода substr
как целого числа... Я думаю, вы могли бы также Number()
, если вам не нравятся внешний вид - 0
Ответ 5
Объект 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. Не уверен.
Не забывайте, что смещение может быть +
, а не только -
для смещения!
Ответ 6
Извините, я немного упростил @James Newton-King
string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);
Ответ 7
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(новый JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
Это работает для меня