Как настроить формат даты и времени в json перед отправкой ответа web api?

#json #asp.net-web-api

#json #asp.net-web-api

Вопрос:

формат даты и времени по умолчанию, возвращаемый моим webapi, не соответствует тому, что я хочу. Как это настроить?

Комментарии:

1. Формат даты и времени, возвращаемый по умолчанию, предположительно соответствует ISO 8601. Универсальный переносимый формат даты, который также отлично подходит для транспортировки. Если вы хотите отформатировать дату в какой-либо другой формат, вы должны получить дату 8601, а затем отформатировать ее соответствующим образом. Практически любая библиотека форматирования может обрабатывать 8601, если она не может, прекратите ее использовать!

Ответ №1:

Создайте класс преобразования даты и времени

 public class DateTimeConverter : DateTimeConverterBase 

{
    public string DateTimeFormat { get; set; } 

    public DateTimeConverter() 
    { 
        this.DateTimeFormat = "MMM/dd/yyyy HH:mm"; //PUT HERE ANY FORMAT YOU NEED! 
    } 


    public override object ReadJson(Newtonsoft.Json.JsonReader reader, 
    Type objectType, object existingValue, 
    Newtonsoft.Json.JsonSerializer serializer) 
    { 
        if (objectType == typeof(DateTime)) 
        { 
            //SEE HERE WHY. 
            throw new NotSupportedException("DateTime not allowed"); 
        } 
        else if (objectType == typeof(DateTimeOffset)) 
        { 
            reader.Read();
            reader.Read();
            DateTime dt = (DateTime)reader.Value; 

            reader.Read();
            reader.Read();
            Int64 offsetinMin = (Int64)reader.Value; 

            DateTime utcTime = new DateTime(dt.AddMinutes(-offsetinMin).Ticks, 
            DateTimeKind.Utc); 

            reader.Read();

            return new DateTimeOffset(utcTime, TimeSpan.FromMinutes(0)); 
        } 
        else 
            return null; 
    } 



    public override void WriteJson(Newtonsoft.Json.JsonWriter writer, 
           object value, 
           Newtonsoft.Json.JsonSerializer serializer) 
    { 
        if (value is DateTime) 
        { 
            DateTime utcTime = (DateTime)value; 
            writer.WriteRawValue(String.Format(""{0}"", 
           ((DateTime)utcTime.ToLocalTime()).ToString(this.DateTimeFormat)));                
        } 

        else if (value is DateTimeOffset) 
        { 
            DateTimeOffset offs = (DateTimeOffset)value; 
            writer.WriteRawValue(String.Format(""{0} UTC({1:##})"", 
            offs.ToString(this.DateTimeFormat), offs.Offset.Minutes)); 
        } 
    } 

}
  

Добавьте эту функцию в контроллер

 protected ActionResult WriteJson(object data, JsonRequestBehavior behavior)
{
    HttpResponseBase response = ControllerContext.HttpContext.Response;

    response.ContentType = "application/json";

    using (JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting.Indented })
    {
        JsonSerializerSettings sett = new JsonSerializerSettings();
        // THE CUSTOM FORMATTER 
        sett.Converters.Add(new DateTimeConverter());
        JsonSerializer serializer = JsonSerializer.Create(sett);

        serializer.Serialize(writer, data);
        writer.Flush();
    }

    return null;
}
  

Использование:

  WriteJson(new { data = XYZObjects }, JsonRequestBehavior.AllowGet);