Sérialisation de DateOnly dans .NET 6
Introduction
.NET 6 introduit le nouveau type DateOnly
, qui représente une date sans heure ni fuseau horaire. Cette fonctionnalité est idéale pour stocker des dates de naissance, des dates d'expiration ou d'autres dates où le temps n'est pas pertinent. Cependant, la sérialisation de DateOnly
peut poser des problèmes si elle n'est pas traitée correctement.
Problèmes de sérialisation
Par défaut, les systèmes de sérialisation comme Newtonsoft.Json ou System.Text.Json ne gèrent pas la sérialisation de DateOnly
de manière native. Si vous essayez de sérialiser un objet contenant une propriété DateOnly
, vous obtiendrez une exception ou un résultat inattendu.
Solutions de sérialisation
Voici quelques solutions pour gérer la sérialisation de DateOnly
dans .NET 6 :
1. Convertir en string
La méthode la plus simple est de convertir la propriété DateOnly
en une chaîne de caractères avant la sérialisation. Vous pouvez utiliser la méthode ToString()
pour obtenir une représentation textuelle de la date.
// Sérialisation avec System.Text.Json
var options = new JsonSerializerOptions { Converters = { new DateOnlyConverter() } };
var json = JsonSerializer.Serialize(obj, options);
// Sérialisation avec Newtonsoft.Json
var json = JsonConvert.SerializeObject(obj);
// Classe DateOnlyConverter
public class DateOnlyConverter : JsonConverter
{
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateOnly.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
}
}
2. Utiliser un convertisseur personnalisé
Vous pouvez créer un convertisseur personnalisé pour gérer la sérialisation et la désérialisation de DateOnly
. Le convertisseur doit implémenter l'interface JsonConverter
pour System.Text.Json et JsonConverter<T>
pour Newtonsoft.Json.
// Sérialisation avec System.Text.Json
var options = new JsonSerializerOptions { Converters = { new DateOnlyConverter() } };
var json = JsonSerializer.Serialize(obj, options);
// Sérialisation avec Newtonsoft.Json
var json = JsonConvert.SerializeObject(obj, new DateOnlyConverter());
// Classe DateOnlyConverter
public class DateOnlyConverter : JsonConverter
{
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateOnly.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
}
}
3. Utiliser un attribut de sérialisation
Vous pouvez utiliser un attribut de sérialisation pour spécifier comment la propriété DateOnly
doit être sérialisée. Cet attribut peut être utilisé pour définir le format de la date, le nom de la propriété dans le JSON, etc.
// Sérialisation avec System.Text.Json
var options = new JsonSerializerOptions { Converters = { new DateOnlyConverter() } };
var json = JsonSerializer.Serialize(obj, options);
// Sérialisation avec Newtonsoft.Json
var json = JsonConvert.SerializeObject(obj);
// Classe DateOnlyConverter
public class DateOnlyConverter : JsonConverter
{
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateOnly.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
}
}
Conclusion
La sérialisation de DateOnly
dans .NET 6 nécessite une approche spécifique. Vous pouvez choisir l'une des solutions ci-dessus, en fonction de vos besoins et de vos préférences. Assurez-vous de gérer la sérialisation de DateOnly
de manière cohérente pour éviter des erreurs et des incohérences dans vos applications.