#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);