fork(1) download
  1. using System;
  2. using System.Text.Json;
  3. using System.Text.Json.Serialization;
  4.  
  5.  
  6. public class EntradaDiario {
  7. public /*required*/ DateOnly Fecha { get; init; }
  8. public /*required*/ string Texto { get; init; }
  9.  
  10. public override string ToString()
  11. {
  12. return $"{this.Fecha}: {this.Texto}";
  13. }
  14. }
  15.  
  16.  
  17. class EntradaDiarioConverter: JsonConverter<EntradaDiario> {
  18. public override EntradaDiario? Read(
  19. ref Utf8JsonReader reader,
  20. Type typeToConvert,
  21. JsonSerializerOptions options)
  22. {
  23. string texto = "";
  24. DateOnly? fecha = null;
  25. EntradaDiario? toret = null;
  26.  
  27. while ( reader.Read() ) {
  28. var tokenType = reader.TokenType;
  29.  
  30. if ( tokenType == JsonTokenType.PropertyName
  31. && reader.ValueTextEquals( "fecha" ) )
  32. {
  33. reader.Read();
  34. fecha = DateOnly.ParseExact(
  35. reader.GetString() ?? "",
  36. new []{ "yyyy-MM-dd" } );
  37. }
  38. if ( tokenType == JsonTokenType.PropertyName
  39. && reader.ValueTextEquals( "texto" ) )
  40. {
  41. reader.Read();
  42. texto = reader.GetString() ?? "";
  43. }
  44. }
  45.  
  46. if ( fecha != null ) {
  47. toret = new EntradaDiario{ Fecha = (DateOnly) fecha, Texto = texto };
  48. }
  49.  
  50. return toret;
  51. }
  52.  
  53. public override void Write(
  54. Utf8JsonWriter writer,
  55. EntradaDiario entrada,
  56. JsonSerializerOptions options)
  57. {
  58. writer.WriteStartObject();
  59. writer.WriteString( "fecha",
  60. $"{entrada.Fecha.Year, 4:D4}-{entrada.Fecha.Month, 2:D2}-{entrada.Fecha.Day, 2:D2}" );
  61. writer.WriteString( "texto", entrada.Texto );
  62. writer.WriteEndObject();
  63. }
  64. }
  65.  
  66.  
  67. class Test {
  68. static void Main()
  69. {
  70. var e1 = new EntradaDiario{
  71. Fecha = DateOnly.FromDateTime( DateTime.Now ),
  72. Texto = "Prueba" };
  73.  
  74. Console.WriteLine( e1 );
  75.  
  76. Console.WriteLine( "Escribiendo JSON..." );
  77. using ( var f = File.Create( "entrada.json" ) ) {
  78. var opts = new JsonSerializerOptions();
  79. opts.Converters.Add( new EntradaDiarioConverter() );
  80. JsonSerializer.Serialize( f, e1, opts );
  81. }
  82.  
  83. Console.WriteLine( "Leyendo JSON..." );
  84. using ( var f = File.OpenRead( "entrada.json" ) ) {
  85. var opts = new JsonSerializerOptions();
  86. opts.Converters.Add( new EntradaDiarioConverter() );
  87. System.Console.WriteLine(
  88. JsonSerializer.Deserialize<EntradaDiario>( f, opts ) );
  89. }
  90. }
  91. }
  92.  
Success #stdin #stdout 0.12s 38076KB
stdin
Standard input is empty
stdout
12/3/2024: Prueba
Escribiendo JSON...
Leyendo JSON...
12/3/2024: Prueba