Je développe une API pour exposer certaines données à l'aide de l'API Web ASP.NET.
Dans l'une des API, le client veut que nous exposions la date au yyyy-MM-dd
format. Je ne veux pas changer les paramètres globaux (par exemple GlobalConfiguration.Configuration.Formatters.JsonFormatter
) pour cela car il est très spécifique à ce client. Et je développe cela dans une solution pour plusieurs clients.
Une des solutions à laquelle je pourrais penser est de créer une personnalisation JsonConverter
, puis de la placer dans la propriété dont j'ai besoin pour effectuer la mise en forme personnalisée
par exemple
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
Je me demande simplement s'il existe un autre moyen facile de le faire.
c#
datetime
asp.net-web-api
json.net
Restez idiot
la source
la source
Réponses:
Tu es sur la bonne piste. Puisque vous avez dit que vous ne pouvez pas modifier les paramètres globaux, alors la meilleure chose à faire est d'appliquer l'
JsonConverter
attribut au besoin, comme vous l'avez suggéré. Il s'avère que Json.Net a déjà un intégréIsoDateTimeConverter
qui vous permet de spécifier le format de date. Malheureusement, vous ne pouvez pas définir le format via l'JsonConverter
attribut, car le seul argument de l'attribut est un type. Cependant, il y a une solution simple: sous - classe laIsoDateTimeConverter
, puis spécifiez le format de date dans le constructeur de la sous - classe. Appliquez l'JsonConverter
attribut si nécessaire, en spécifiant votre convertisseur personnalisé, et vous êtes prêt à partir. Voici l'intégralité du code nécessaire:Si cela ne vous dérange pas d'avoir le temps là-dedans également, vous n'avez même pas besoin de sous-classer IsoDateTimeConverter. Son format de date par défaut est
yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK
(comme indiqué dans le code source ).la source
IsonDateTimeConverter
été tiré directement du code source Json.Net ; donc je reviens sur votre modification à ce sujet.Vous pouvez utiliser cette approche:
Et utilisez-le de cette façon:
La chaîne DateTimeFormat utilise la syntaxe de chaîne de format .NET décrite ici: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
la source
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
:, cela signifie que votre version de json.net est trop ancienne. Vous devez mettre à jour vers la dernière version de json.net.Cela peut également être fait avec une
IsoDateTimeConverter
instance, sans modifier les paramètres de formatage globaux:Cela utilise la
JsonConvert.SerializeObject
surcharge qui prend unparams JsonConverter[]
argument.la source
Également disponible en utilisant l'une des surcharges de paramètres du sérialiseur:
Ou
Des surcharges prenant un type sont également disponibles.
la source
yyyy-MM-ddTHH:mm:ssZ
.. 24 heures sur les heures.Créez une classe d'assistance et appliquez-la à votre attribut de propriété
Classe d'assistance:
Votre code utilise comme ceci:
la source
Il existe une autre solution que j'utilise. Créez simplement une propriété de chaîne et utilisez-la pour json. Cette propriété retournera la date correctement formatée.
De cette façon, vous n'avez pas à créer de classes supplémentaires. En outre, il vous permet de créer différents formats de données. par exemple, vous pouvez facilement créer une autre propriété pour l'heure en utilisant le même DateTime.
la source
Parfois, la décoration de l'attribut json convert ne fonctionnera pas, cela fonctionnera grâce à une exception disant que " 2010-10-01" est une date valide . Pour éviter ce type, j'ai supprimé l'attribut json convert sur la propriété et mentionné dans la méthode deserilizedObject comme ci-dessous.
la source
Avec ci-dessous convertisseur
Peut l'utiliser avec un format personnalisé par défaut
Ou tout format spécifié pour une propriété
la source