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<EntradaDiario> {
	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<EntradaDiario>( f, opts ) );
		}
	}
}