8

When I return object that contains DateTime property using

return Json(value);

on client I receive

"/Date(1336618438854)/"

If i return the same value using

return Json(JsonConvert.SerializeObject(value));

then the returned serialized value (together with serialized object) is time zone aware:

"/Date(1336618438854-0400)/"

Is there any way to get consistent DateTime result without without double serialization? I read somewhere that MS will include Newtonsoft JSON into MVC?

user1188755
  • 227
  • 1
  • 2
  • 7
  • 1
    Hmm Google? That sounds familiar. Newton's serialization is working fine. Question is why MVC is ignoring time zone when they have adopted /Date()/ format. – user1188755 May 10 '12 at 14:07
  • Simply using `$.parseJSON(result)` will properly parse the dates. http://stackoverflow.com/a/4540007/752974 – Pete Dec 30 '14 at 20:36

4 Answers4

11

I finally figured out what to do.
I will switch my project to ISO 8601 DateTime format. Serialization is done nicely with JSON.net, just by decorating the datetime property on the object with JsonConverter attribute.

    public class ComplexObject 
    {
        [JsonProperty]
        public string ModifiedBy { get; set; }
        [JsonProperty]
        [JsonConverter(typeof(IsoDateTimeConverter))]
        public DateTime Modified { get; set; }
        ...
     }

To return serialized object to the client ajax call I can do:

    return Json(JsonConvert.SerializeObject(complexObjectInstance));

and on the client:

    jsObject = JSON.parse(result)

Now I am thinking it would be probably simple to override default ASP.NET MVC default JSON serializer to us Newtonsoft JSON.net ISO 8601 serialization, and yes principle should be similar to this thread: Change Default JSON Serializer Used In ASP MVC3.

Community
  • 1
  • 1
user1188755
  • 227
  • 1
  • 2
  • 7
  • Great answer but I found that the Newtonsoft.Json attributes are not necessary. Simply using `$.parseJSON(result)` will properly parse the dates. http://stackoverflow.com/a/4540007/752974 – Pete Dec 30 '14 at 20:32
0

In the WebApiConfig set:

config.Formatters.Remove(config.Formatters.XmlFormatter);
        //config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
        config.Formatters.JsonFormatter.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;

        config.MapHttpAttributeRoutes();

In the ApiController return this:

return Request.CreateResponse(HttpStatusCode.OK, obj);

Good Luck CAhumada

-2

If you dont want to dig in to the Parsing thing than simply convert your date in to the string than parse it with the JSON.

for example

return Json(DateTime.Now.ToString("your date format if you want to specify"));
alok_dida
  • 1,723
  • 2
  • 17
  • 36
  • Sorry, but this post is not about showing dates. It is about consistency in serialized date format for complex objects containing DateTime properties in server to client and client to server scenarios. And what you are suggesting I am doing in the 2nd line with SerializeObject for the whole object. – user1188755 May 10 '12 at 14:11
  • @user1188755 ... check below this http://stackoverflow.com/questions/668488/parsing-json-datetime-from-newtonsofts-json-serializer – alok_dida May 11 '12 at 04:23
-2

It returns Server Date Format. You need to define your own function.

function jsonDateFormat(jsonDate) {

// Changed data format;
return (new Date(parseInt(jsonDate.substr(6)))).format("mm-dd-yyyy / h:MM tt");

};

Manish Kundu
  • 145
  • 2
  • 4