2012-05-10 8 views
5

Quand je retourne l'objet qui contient la propriété DateTime en utilisantASP.NET MVC Controller.Json DateTime sérialisation vs NewtonSoft Json DateTime sérialisation

return Json(value); 

sur le client je reçois

"/Date(1336618438854)/" 

Si je retourne la même valeur en utilisant

return Json(JsonConvert.SerializeObject(value)); 

puis la valeur sérialisée renvoyée (avec l'objet sérialisé) i s sensible au fuseau horaire:

"/Date(1336618438854-0400)/" 

Est-il possible d'obtenir un résultat DateTime cohérent sans double sérialisation? J'ai lu quelque part que MS inclura Newtonsoft JSON dans MVC?

+0

jamais entendu parler de Google? premier résultat ... http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx – MilkyWayJoe

+0

Hmm Google? Cela semble familier. La sérialisation de Newton fonctionne bien. La question est pourquoi MVC ignore le fuseau horaire quand ils ont adopté/Date()/format. – user1188755

+0

Il suffit d'utiliser $ .parseJSON (result) 'pour analyser correctement les dates. http://stackoverflow.com/a/4540007/752974 – Pete

Répondre

-2

Si vous ne voulez pas vous plonger dans la fonction d'analyse syntaxique, il vous suffit de convertir votre date dans la chaîne plutôt que de l'analyser avec le JSON.

par exemple

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

Désolé, mais cet article ne concerne pas les dates.Il s'agit de la cohérence dans le format de date sérialisé pour les objets complexes contenant des propriétés DateTime dans les scénarios de serveur à client et de client à serveur. Et ce que vous suggérez je fais dans la 2ème ligne avec SerializeObject pour l'objet entier. – user1188755

+0

@ user1188755 ... vérifiez ci-dessous http://stackoverflow.com/questions/668488/parsing-json-datetime-from-newtonsofts-json-serializer –

8

J'ai finalement compris ce qu'il faut faire.
Je vais passer mon projet au format ISO 8601 DateTime. La sérialisation est bien faite avec JSON.net, juste en décochant la propriété datetime sur l'objet avec l'attribut JsonConverter.

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

Pour revenir objet sérialisé à l'appel ajax client que je peux faire:

return Json(JsonConvert.SerializeObject(complexObjectInstance)); 

et sur le client:

jsObject = JSON.parse(result) 

Maintenant, je pense qu'il serait probablement simple à remplacer par défaut ASP.NET MVC sérialiseur JSON par défaut à nous Newtonsoft JSON.net ISO 8601 sérialisation, et oui principe devrait être similaire à ce fil: Change Default JSON Serializer Used In ASP MVC3.

+0

Grande réponse mais j'ai trouvé que les attributs Newtonsoft.Json ne sont pas nécessaires. Le simple fait d'utiliser '$ .parseJSON (result)' analysera correctement les dates. http://stackoverflow.com/a/4540007/752974 – Pete

-2

Renvoie le format de date du serveur. Vous devez définir votre propre fonction.

function jsonDateFormat(jsonDate) { 

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

};

+1

qu'est-ce que '.format'? –

0

Dans le WebApiConfig ensemble:

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

Dans le ApiController retour ceci:

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

Bonne chance CAhumada

Questions connexes