web-dev-qa-db-fra.com

Forcer JSON.NET à inclure des millisecondes lors de la sérialisation de DateTime (même si le composant ms est égal à zéro)

J'utilise JSON.NET pour sérialiser les valeurs DateTime directement à partir d'instances d'objet (sans utiliser DateTime.ToString () avec le formateur).

Existe-t-il un moyen de forcer JSON.NET à inclure des millisecondes dans la sérialisation même si le composant milliseconde de DateTime est zéro?

Contexte: J'ai un consommateur de services Web très lent pour ce noeud final JSON. La logique conditionnelle est coûteuse pour le consommateur, donc j'aimerais fournir à chaque fois le même formatage de données.

25
Alex

Nous avons rencontré le même problème sur mon projet actuel. Nous utilisons l'API Web (et donc JSON.Net) pour implémenter une API REST. Nous avons découvert que, lors de la sérialisation d'objets DateTimename__, JSON.Net omet les zéros de fin de millisecondes ou les millisecondes de la date si elle est égale à zéro. Nos clients attendaient une chaîne de date-heure de longueur fixe, avec exactement 3 chiffres pour les millisecondes. Nous l'avons corrigé en procédant comme suit dans Application_Start():

JsonSerializerSettings settings = HttpConfiguration.Formatters.JsonFormatter.SerializerSettings;
IsoDateTimeConverter dateConverter = new IsoDateTimeConverter 
{ 
    DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'" 
};
settings.Converters.Add(dateConverter);

Si vous n'utilisez pas l'API Web, vous pouvez faire la même chose en créant une nouvelle instance de JsonSerializerSettingsname__, en y ajoutant IsoDateTimeConvertercomme indiqué ci-dessus, puis en transmettant les paramètres du sérialiseur à JsonConvert.SerializeObject().

Remarque: Si vous sérialisez DateTimeOffsetou un DateTimelocal et que vous souhaitez inclure le décalage du fuseau horaire, remplacez le 'Z' entre guillemets par le format ci-dessus par un Kname __. Voir Chaînes de format de date et d'heure personnalisées dans la documentation pour plus d'informations.

38
Brian Rogers

Pour tous les utilisateurs de Java qui trouvaient cette réponse et souhaitaient analyser de tels horodatages .NET formatés par défaut, je voulais noter une approche Java 8 (Java.time.*) pour analyser le format:

public static final DateTimeFormatter FORMATTER =
    new DateTimeFormatterBuilder().appendPattern("yyyy-M-d'T'H:m:s")
                                  .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
                                  .toFormatter();
...
LocalDateTime ldt = LocalDateTime.parse(dateString, FORMATTER);

Cela signifie qu'il faut s'attendre à 0-3 chiffres de millisecondes fractionnaires, avec true pour un point décimal attendu. Il interprète correctement, par exemple, ".47" comme 470 millisecondes.

0
dbreaux