web-dev-qa-db-fra.com

Newtonsoft.Json personnaliser les dates de sérialisation

J'utilise Newtonsoft.Json Pour sérialiser mes dates de C # en javscript ce que je veux faire est que le sérialiseur json utilise la culture actuelle pour formater les dates en chaîne

Voici ce que j'obtiens avec mon sérialiseur Json:

JsonConvert.SerializeObject(DateTime.Now);

le résultat est:

"2016-07-08T17:10:17.6722753-05:00"

Mais ce que je préfère c'est:

"08/07/2016 17:10:57"

Parce que ma culture actuelle est le Brésil et je veux que mes dates soient affichées de la manière ci-dessus.

Est-il possible de globalement (pour toute date qui peut être sérialisée) dire au sérialiseur json dans Newtonsoft.Json d'utiliser comme s'il faisait la date.ToString() (parce que ToString respecte la culture dans System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat et donne le bon format en conséquence)

12
Amete Blessed

Vous voudrez définir JsonSerializerSettings.DateFormatString au format souhaité.

var jsonSettings = new JsonSerializerSettings();
jsonSettings.DateFormatString = "dd/MM/yyy hh:mm:ss";

string json = JsonConvert.SerializeObject(someObject, jsonSettings);

Après cela, vous pouvez soit passer l'objet de paramètres à chaque fois que vous utilisez le sérialiseur, soit suivre les étapes de la réponse référencée par dbc. Bien que vous ne mentionniez pas où cela s'exécute (ASP.NET, bureau, UWP, etc.), la façon dont vous le définissez globalement peut différer.

28
Devin Goble

Oui, vous pouvez utiliser un convertisseur dans les paramètres de JsonSerializer.

public class SpecialDateTimeConverter : DateTimeConverterBase
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override void WriteJson(JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
        {
             writer.WriteValue(((DateTime)value).ToString("dd/MM/yyyy hh:mm:ss"));
        }
    }

    string convertedDateTime = JsonConvert.SerializeObject(DateTime.Now, Formatting.Indented, new SpecialDateTimeConverter());
1
Lockdowne