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

di Stefano Mostarda, in .NET,

Nello script precedente, abbiamo visto come serializzare il tipo DateOnly. In questo script ci occupiamo invece del tipo TimeOnly. Anche in questo caso, System.Text.Json non ne supporta la serializzazione e la deserializzazione, quindi queste operazioni falliranno se le effettuaiamo su un tipo TimeOnly o su un oggetto che ha una proprietà di tipo TimeOnly.

Così come per DateOnly, possiamo creare un converter anche per TimeOnly sfruttando gli stessi meccanismi. Il codice del converter è il seguente.

public class TimeOnlyJsonConverter : JsonConverter<TimeOnly>
{
  public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  {
    int hours = 0;
    int minutes = 0;
    int seconds = 0;
    reader.Read();
    while (reader.TokenType != JsonTokenType.EndObject)
    {
      if (reader.TokenType == JsonTokenType.PropertyName)
      {
        if (reader.GetString() == "hours")
        {
          reader.Read();
          hours = reader.GetInt32();
        }
        else if (reader.GetString() == "minutes")
        {
          reader.Read();
          minutes = reader.GetInt32();
        }
        else if (reader.GetString() == "seconds")
        {
          reader.Read();
          seconds = reader.GetInt32();
        }
      }
      reader.Read();
    }
    return new TimeOnly(hours, minutes, seconds);
  }

  public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
  {
    writer.WriteStartObject();
    writer.WritePropertyName("hours");
    writer.WriteNumberValue(value.Hours);
    writer.WritePropertyName("minutes");
    writer.WriteNumberValue(value.Minutes);
    writer.WritePropertyName("seconds");
    writer.WriteNumberValue(value.Seconds);
    writer.WriteEndObject();
  }
}

Per prima cosa, il converter deve ereditare da JsonConverter. Successivamente, nel metodo Write dobbiamo specificare come intendiamo serializzare l'istanza di TimeOnly che viene passata in input. Nel nostro caso l'istanza viene serializzata crando un oggetto che ha le proprietà hours, minutes e seconds. Infine, nel metodo Read scorriamo le proprietà dell'oggetto JSON che viene passato in input e recuperiamo hours, minutes e seconds per creare l'istanza di TimeOnly 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