256 votes

Format de Date JsonResult ASP.NET MVC

J’ai une action de contrôleur qui retourne effectivement simplement un JsonResult de mon modèle. Donc, dans ma méthode, j’ai quelque chose comme ce qui suit :

Cela fonctionne bien, sauf pour un problème. Il y a une propriété de date dans le modèle, et cela semble être retournées dans le résultat de Json comme suit :

Comment devrais j’être traite de dates donc ils sont retournés dans le format que j’ai besoin ? Ou comment traiter ce format ci-dessus dans le script ?

201voto

JPot Points 2078

Juste pour élargir sur casperOne de réponse.

La spécification JSON ne prend pas en compte les valeurs de Date. MS a dû faire un appel, et le chemin qu'ils ont choisi était d'exploiter un petit truc en javascript représentation de chaînes: la chaîne de caractère "/" est le même que le "\/", et un littéral de chaîne va jamais être sérialisé "\/" (même "\/" doit être mappé à "\\/").

Voir http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 pour une meilleure explication (faites défiler jusqu'à "à Partir de JavaScript Littéraux JSON")

L'un des points sensibles de JSON est l' l'absence d'une date/heure littérale. De nombreux les gens sont surpris et déçu pour l'apprendre quand ils ont d'abord rencontre JSON. L'explication simple (consolante ou pas) pour l'absence de date/heure littéral, c'est que JavaScript jamais eu un seul: Le soutien pour valeurs de date et heure dans le JavaScript est entièrement fourni par le biais de la Date objet. La plupart des applications à l'aide de JSON comme un format de données, par conséquent, généralement ont tendance à utiliser une chaîne de caractères ou un nombre pour exprimer la date et l'heure des valeurs. Si une chaîne est utilisée, vous pouvez généralement s'attendre à être dans la norme ISO 8601. Si un numéro est utilisé, au lieu de cela, la valeur est généralement à-dire le nombre de millisecondes Universel Coordonné L'heure (UTC) depuis l'époque où époque est définie comme minuit le 1er janvier 1970 (UTC). Encore une fois, ce n'est qu'une simple convention et ne fait pas partie du JSON standard. Si vous échangez des données avec une autre application, vous aurez besoin de vérifier sa documentation pour voir comment il encode les valeurs de date et heure dans un JSON littérale. Par exemple, Microsoft ASP.NET AJAX n'utilise pas de des conventions. Plutôt, il encode .NET valeurs DateTime comme un Chaîne JSON, où le contenu de la chaîne /Date(tiques) et où les tiques représente le nombre de millisecondes depuis époque (UTC). Donc, Le 29 Novembre 1989, 4:55:30, en l'UTC est codée en tant que "\/Date(628318530718)\/".

Une solution serait de simplement l'analyser:

value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));

Cependant j'ai entendu dire qu'il y a un paramètre quelque part pour obtenir le sérialiseur de sortie DateTime objets avec l' new Date(xxx) de la syntaxe. Je vais essayer de creuser ça.

104voto

Roy Tinker Points 8054

Voici ma solution en Javascript - très semblable à JPot, mais plus courte (et éventuellement un tout petit peu plus rapide) :

« value.substr(6) » sort le « / Date ("part et la fonction parseInt ignore les caractères non-nombre qui se produisent à la fin.

70voto

Perishable Dave Points 1005

Il existe assez peu de réponses à gérer côté client, mais vous pouvez changer la sortie côté serveur si vous le souhaitez.

Il ya quelques façons d'aborder cette, je vais commencer avec les bases. Vous aurez à la sous-classe le JsonResult de classe et de remplacer les ExecuteResult méthode. À partir de là, vous pouvez prendre quelques approches différentes pour modifier la sérialisation.

Approche 1: L'implémentation par défaut utilise le JsonScriptSerializer. Si vous jetez un oeil à la documentation, vous pouvez utiliser le RegisterConverters méthode pour ajouter des JavaScriptConverters. Il y a un peu de problèmes avec cela: Le JavaScriptConverter sérialise un dictionnaire, c'est qu'il prend un objet et sérialise un dictionnaire Json. Afin de rendre l'objet à sérialiser à une chaîne, il nécessite un peu de hackery, voir le post. Ce hack sera également échapper à la chaîne.

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            // Use your custom JavaScriptConverter subclass here.
            serializer.RegisterConverters(new JavascriptConverter[] { new CustomConverter });

            response.Write(serializer.Serialize(Data));
        }
    }
}

Approche 2 (recommandé): La deuxième approche est de commencer avec le substituée JsonResult et aller avec une autre sérialiseur Json, dans mon cas, le Json.NET sérialiseur. Cela ne nécessite pas la hackery de l'approche 1. Voici ma mise en œuvre de la JsonResult sous-classe:

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            // Using Json.NET serializer
            var isoConvert = new IsoDateTimeConverter();
            isoConvert.DateTimeFormat = _dateFormat;
            response.Write(JsonConvert.SerializeObject(Data, isoConvert));
        }
    }
}

Des crédits supplémentaires: James Newton-King

32voto

Eric Points 828

Moment.js est une bibliothèque datetime étendue qui prend également en charge cela. http://momentjs.com/docs/#/parsing/asp-net-JSON-dates/

ex : moment("/Date(1198908717056-0700)/")

19voto

Robert Koritnik Points 45499

Utilisation de jQuery pour auto-convertir des dates avec des $.parseJSON

Note: cette réponse fournit un jQuery extension qui ajoute automatiquement des ISO et .net date de prise en charge du format.

Depuis que vous utilisez Asp.net MVC je soupçonne que vous êtes à l'aide de jQuery sur le côté client. Je vous suggère de lire cet article de blog qui a du code comment utiliser $.parseJSON de convertir automatiquement les dates pour vous.

Le Code prend en charge Asp.net les dates formatées comme ceux que vous avez mentionné, ainsi que la norme ISO dates formatées. Toutes les dates seront automatiquement mis en forme pour vous en utilisant $.parseJSON().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X