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 ) );
}
}
}