2013-11-17 4 views
1

Я попытался Тро дату возвращения в формате ISO с использованием Json.NET от контроллера ASP.NET MVC4Как вернуть дату JSon от контроллера MVC4 в формате ISO

public JsonResult Sales() { 
    var saleList = new List<Sale>(); 

    ... 
     var str = JsonConvert.SerializeObject(saleList); 
     return Json(str, JsonRequestBehavior.AllowGet); 
     } 

public class Sale 
{ 
    public DateTime saledate { get; set; } 
    ... 
} 

Но он возвращает весь объект JSON нотацию как одну строку.

Как вернуть дату в формате ISO как объект json?

+0

Вы можете использовать сериализатор ServiceStack? –

+0

Я могу использовать любое бесплатное программное обеспечение в C# – Andrus

ответ

1

Вы можете сделать это с помощью ServiceStack JSON serializer, но сначала вы должны интегрировать его в ASP.NET MVC.

После установки пакета, настроить DateTime сериализации в запуске приложения:

JsConfig.DateHandler = JsonDateHandler.ISO8601; 

Создать тип ActionResult для содержания JSON:

public class CustomJsonResult : ActionResult 
{ 
    private readonly object _data; 
    private readonly string _content; 
    private readonly Encoding _encoding; 

    public CustomJsonResult(object data) : this(data, null, null) { } 

    public CustomJsonResult(object data, string content) : this(data, content, null) { } 

    public CustomJsonResult(object data, Encoding encoding) : this(data, null, encoding) { } 

    public CustomJsonResult(object data, string content, Encoding encoding) 
    { 
     _data = data; 
     _content = content; 
     _encoding = encoding; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     HttpResponseBase response = context.HttpContext.Response; 
     response.ContentType = string.IsNullOrEmpty(_content) ? "application/json" : _content; 

     if (_encoding != null) 
     { 
      response.ContentEncoding = _encoding; 
     } 

     response.Write(JsonSerializer.SerializeToString(_data)); 
    } 
} 

Затем вы можете добавить эти методы базового контроллера:

protected CustomJsonResult CustomJson(object data) 
{ 
    return new CustomJsonResult(data); 
} 

protected CustomJsonResult CustomJson(object data, string content) 
{ 
    return new CustomJsonResult(data, content); 
} 

protected CustomJsonResult CustomJson(object data, Encoding encoding) 
{ 
    return new CustomJsonResult(data, encoding); 
} 

protected CustomJsonResult CustomJson(object data, string content, Encoding encoding) 
{ 
    return new CustomJsonResult(data, content, encoding); 
} 

Наконец-то вы можете вернуть результат следующим образом:

return CustomJson(saleList); 
+0

Это выглядит сложным. Может быть, можно написать замену Json(), которая использует этот конвертер? – Andrus

+0

@ Andrus Возможно, но я думаю, что это правильный способ использования SS-сериализатора в приложении MVC. –

0

Вы можете установить настройки при использовании перегрузки для SerializeObject, который принимает параметр JsonSerializerSettings:

public static string SerializeObject(
    Object value, 
    JsonSerializerSettings settings 
) 

JsonSerializerSettings имеет свойство, называемое DateFormatHandling используется для различения формата Microsoft и формата ISO.

Вы также можете использовать пользовательский конвертер в JSON.NET. Пользовательские преобразователи могут применяться с использованием атрибута CustomConverter.

Пример можно найти в документации Json.NET: http://james.newtonking.com/json/help/index.html

Я предпочел бы первый вариант.

+0

Я могу создать строку json, но как вернуть ее из json controller? Uing 'return Json (..)' Json() не принимает строку json. – Andrus

+0

Если вы используете JSON.NET в своем проекте MVC, вы можете установить настройки по всему миру. См. Http://stackoverflow.com/questions/13274625/how-to-set-custom-jsonserializersettings-for-json-net-in-mvc-4-web-api – Sascha

+0

Я обновил вопрос. использование Json.NET возвращает объект как одну строку. – Andrus

Смежные вопросы