2012-05-10 13 views
5

Kiedy wrócę obiekt, który zawiera właściwość DateTime przy użyciuASP.NET MVC Controller.Json DateTime serializacji vs NewtonSoft Json DateTime serializacji

return Json(value); 

na kliencie otrzymam

"/Date(1336618438854)/" 

Jeśli wrócę taką samą wartość przy użyciu następnie zwróconej wartości szeregowej (razem z serializowanym obiektem) i s Strefa czasowa:

"/Date(1336618438854-0400)/" 

Czy istnieje sposób na uzyskanie spójnego wyniku DateTime bez bez podwójnej serializacji? Czytałem gdzieś, że MS będzie zawierać Newtonsoft JSON w MVC?

+0

słyszał o Google? pierwszy wynik ... http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx – MilkyWayJoe

+0

Hmm Google? Brzmi znajomo. Serializacja Newtona działa dobrze. Pytanie, dlaczego MVC ignoruje strefę czasową po przyjęciu/Date()/formacie. – user1188755

+0

Po prostu użycie '$ .parseJSON (result)' odpowiednio przeanalizuje daty. http://stackoverflow.com/a/4540007/752974 – Pete

Odpowiedz

-2

Jeśli nie chcesz zagłębić się w parsowanie, zamiast po prostu przekształcić datę na ciąg, niż sparsować go przy pomocy JSON.

np

return Json(DateTime.Now.ToString("your date format if you want to specify")); 
+0

Przepraszamy, ale ten wpis nie dotyczy dat.Chodzi o spójność formatu zserializowanych dat dla złożonych obiektów zawierających właściwości DateTime w scenariuszu serwer-klient i klient-serwer. I co sugerujesz robię w drugiej linii z SerializeObject dla całego obiektu. – user1188755

+0

@ user1188755 ... sprawdź poniżej http://stackoverflow.com/questions/668488/parsing-json-datetime-from-newtonsofts-json-serializer –

8

I w końcu zorientowali się, co zrobić.
Przełączę mój projekt na format ISO 8601 DateTime. Serializacja przebiega ładnie z JSON.net, po prostu dekorując właściwość datetime na obiekcie za pomocą atrybutu JsonConverter.

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

Aby powrócić odcinkach obiektu do wywołania AJAX klient może zrobić:

return Json(JsonConvert.SerializeObject(complexObjectInstance)); 

i na kliencie:

jsObject = JSON.parse(result) 

Teraz myślę, że byłoby prawdopodobnie prosty przesłonić domyślny serializator JSON ASP.NET MVC do nas serializacji NewtonSoft JSON.net ISO 8601 i zasada tak powinna być podobna do tego wątku: Change Default JSON Serializer Used In ASP MVC3.

+0

Świetna odpowiedź, ale okazało się, że atrybuty Newtonsoft.Json nie są konieczne. Po prostu użycie '$ .parseJSON (result)' odpowiednio przeanalizuje daty. http://stackoverflow.com/a/4540007/752974 – Pete

-2

Zwraca format daty serwera. Musisz zdefiniować swoją własną funkcję.

function jsonDateFormat(jsonDate) { 

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

};

+1

co to jest ".format"? –

0

W WebApiConfig zestawie:

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

W ApiController wrócić w tym:

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

Good Luck CAhumada