using System; using System.Text.Json; using System.Text.Json.Serialization; public class EntradaDiario { public /*required*/ DateOnly Fecha { get; init; } public /*required*/ string Texto { get; init; } public override string ToString() { return $"{this.Fecha}: {this.Texto}"; } } class EntradaDiarioConverter: JsonConverter { public override EntradaDiario? Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { string texto = ""; DateOnly? fecha = null; EntradaDiario? toret = null; while ( reader.Read() ) { var tokenType = reader.TokenType; if ( tokenType == JsonTokenType.PropertyName && reader.ValueTextEquals( "fecha" ) ) { reader.Read(); fecha = DateOnly.ParseExact( reader.GetString() ?? "", new []{ "yyyy-MM-dd" } ); } if ( tokenType == JsonTokenType.PropertyName && reader.ValueTextEquals( "texto" ) ) { reader.Read(); texto = reader.GetString() ?? ""; } } if ( fecha != null ) { toret = new EntradaDiario{ Fecha = (DateOnly) fecha, Texto = texto }; } return toret; } public override void Write( Utf8JsonWriter writer, EntradaDiario entrada, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteString( "fecha", $"{entrada.Fecha.Year, 4:D4}-{entrada.Fecha.Month, 2:D2}-{entrada.Fecha.Day, 2:D2}" ); writer.WriteString( "texto", entrada.Texto ); writer.WriteEndObject(); } } class Test { static void Main() { var e1 = new EntradaDiario{ Fecha = DateOnly.FromDateTime( DateTime.Now ), Texto = "Prueba" }; Console.WriteLine( e1 ); Console.WriteLine( "Escribiendo JSON..." ); using ( var f = File.Create( "entrada.json" ) ) { var opts = new JsonSerializerOptions(); opts.Converters.Add( new EntradaDiarioConverter() ); JsonSerializer.Serialize( f, e1, opts ); } Console.WriteLine( "Leyendo JSON..." ); using ( var f = File.OpenRead( "entrada.json" ) ) { var opts = new JsonSerializerOptions(); opts.Converters.Add( new EntradaDiarioConverter() ); System.Console.WriteLine( JsonSerializer.Deserialize( f, opts ) ); } } }