Анализ JSON DateTime из сериализатора JSON от Newtonsoft

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

/Date(1237588418563+0000)/

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

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


person tags2k    schedule 21.03.2009    source источник
comment
Это работает для вас?: tek-tips.com/viewthread.cfm ?qid=1526126&page=8   -  person mechanical_meat    schedule 23.03.2009


Ответы (7)


Используйте один из 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

person James Newton-King    schedule 30.05.2009
comment
Для справки: пространство имен в IsoDateTimeConverter — Newtonsoft.Json.Converters, а в JsonConvert.SerializeObject — Newtonsoft.Json. - person Jarrett Widman; 06.03.2012

Я придумал другой подход, который может быть полезен для некоторых. В основном я создаю свой собственный 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) } });

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

person Johann    schedule 15.08.2012
comment
Если кто-то хочет расширить его, глобально зарегистрировавшись на Asp.Net MVC.services.AddMvc() .AddJsonOptions(jsonOption => { jsonOption.SerializerSettings.Converters.Add( new JSONCustomDateConverter("dd/mm/yyy", TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"))); }); - person Vikash Kumar; 03.05.2017

Начиная с Newtonsoft Json.Net версии 4.5r5, вы используете класс класса JsonPropertyAttribute и устанавливаете его свойство ItemConverterType Property. Использование:

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

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

person Anderson    schedule 12.05.2012
comment
Этот ответ является самым актуальным - person Yanick Rochon; 26.02.2013
comment
Я не думаю, что понимаю, что это должно делать или как это должно работать. В моем классе у меня есть это: [JsonProperty (ItemConverterType = typeof (IsoDateTimeConverter))] public System.DateTime RecordInsertedDate { get; набор; } Но мои даты по-прежнему проходят как формат по умолчанию /Date(132456560000000)/ - person James Gray; 05.03.2015
comment
NVM, я использовал ServiceStack, который переопределял это. Вы должны использовать ServiceStack JsConfig.DateHandler = DateHandler.ISO8601; config в вашем коде, чтобы получить ISO8601 - person James Gray; 05.03.2015

Столкнулся с той же проблемой и нашел решение по ссылке от Адама:

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

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

person peirix    schedule 11.11.2010

Объект 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. Точно сказать не могу.

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

person PowerSparks    schedule 04.02.2012
comment
вы также используете регулярное выражение, а затем оцениваете текст следующим образом: eval("new " + data.CreateDate.replace(/\//ig,"")), похоже, работает просто отлично - person Anthony R; 25.09.2015

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

string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);    
person Ben    schedule 09.09.2014

ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JavaTimeModule());

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

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

person Jayen Chondigara    schedule 04.02.2016
comment
Что такое ObjectMapper? - person Liam; 17.08.2018