Serializzare e deserializzare un tipo DateOnly con System.Text.Json

di Stefano Mostarda, in .NET,

.NET 6 ha introdotto il tipo DateOnly. System.Text.Json non ne supporta la serializzazione e la deserializzazione, quindi queste operazioni falliranno se le effettuaiamo su un tipo DateOnly o su un oggetto che ha una proprietà di tipo DateOnly.

Grazie all'estensibilità della libreria System.Text.Json, possiamo creare un custom converter che ci permette di serializzare e deserializzare un oggetto di tipo DateOnly decidendo noi il formato. Il codice del converter è il seguente.

public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
  public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  {
    int day = 0;
    int month = 0;
    int year = 0;
    reader.Read();
    while (reader.TokenType != JsonTokenType.EndObject)
    {
      if (reader.TokenType == JsonTokenType.PropertyName)
      {
        if (reader.GetString() == "day")
        {
          reader.Read();
          day = reader.GetInt32();
        }
        else if (reader.GetString() == "month")
        {
          reader.Read();
          month = reader.GetInt32();
        }
        else if (reader.GetString() == "year")
        {
          reader.Read();
          year = reader.GetInt32();
        }
      }
      reader.Read();
    }
    return new DateOnly(year, month, day);
  }

  public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
  {
    writer.WriteStartObject();
    writer.WritePropertyName("day");
    writer.WriteNumberValue(value.Day);
    writer.WritePropertyName("month");
    writer.WriteNumberValue(value.Month);
    writer.WritePropertyName("year");
    writer.WriteNumberValue(value.Year);
    writer.WriteEndObject();
  }
}

Per prima cosa, il converter deve ereditare da JsonConverter. Successivamente, nel metodo Write dobbiamo specificare come intendiamo serializzare l'istanza di DateOnly che viene passata in input. Nel nostro caso serializziamo l'istanza creando un oggetto che ha le proprietà day, month e year. Infine, nel metodo Read scorriamo le proprietà dell'oggetto JSON che viene passato in input e recuperiamo day, month e year per creare l'istanza di DateOnly da restituire.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi