fork download
  1. using System;
  2. using System.Text.Json;
  3. using System.Text.Json.Serialization;
  4.  
  5.  
  6. public class Libro {
  7. public enum Tipo { TapaBlanda, TapaDura, Bolsillo }
  8. public /*required*/ Autor Autor { get; init; }
  9. public /*required*/ string Titulo { get; init; }
  10. public /*required*/ int Pags { get; init; }
  11. public /*required*/ string Isbn { get; init; }
  12. public /*required*/ Tipo Formato { get; init; }
  13.  
  14. public override string ToString()
  15. {
  16. return $"{Autor.Nombre}: {Titulo} (ISBN: {Isbn}, {Pags} pgs.)";
  17. }
  18. }
  19.  
  20.  
  21. public class Autor {
  22. public Autor()
  23. {
  24. this.libros = new List<Libro>();
  25. }
  26.  
  27. public /*required*/ string Nombre { get; init; }
  28. public /*required*/ int AnnoNac { get; init; }
  29.  
  30. public Autor Inserta(Libro libro)
  31. {
  32. this.libros.Add( libro );
  33. return this;
  34. }
  35. public IList<Libro> Libros {
  36. get => ( (List<Libro>) this.libros ).AsReadOnly();
  37. init {
  38. this.libros.Clear();
  39. foreach (var libro in value) {
  40. this.libros.Add( libro );
  41. }
  42. }
  43. }
  44.  
  45. public override string ToString()
  46. {
  47. string infoAutor = $"{this.Nombre} ({this.AnnoNac})";
  48. return infoAutor + "\n" + string.Join( '\n', this.Libros);
  49. }
  50.  
  51. private IList<Libro> libros;
  52. }
  53.  
  54.  
  55. public class Biblioteca {
  56. public Biblioteca()
  57. {
  58. this.autores = new List<Autor>();
  59. }
  60.  
  61. public /*required*/ string Nombre { get; init; }
  62. public IList<Autor> Autores
  63. {
  64. get => ( (List<Autor>) this.autores ).AsReadOnly();
  65. init {
  66. this.autores.Clear();
  67. foreach (var autor in value) {
  68. this.autores.Add( autor );
  69. }
  70. }
  71. }
  72.  
  73. public Biblioteca Inserta(Autor autor)
  74. {
  75. this.autores.Add( autor );
  76. return this;
  77. }
  78.  
  79. public override string ToString()
  80. {
  81. return this.Nombre + "\n" + string.Join( '\n', this.Autores );
  82. }
  83.  
  84. private IList<Autor> autores;
  85. }
  86.  
  87.  
  88. public class JsonBiblioteca {
  89. public /*required*/ Biblioteca Biblioteca { get; init; }
  90.  
  91. public void Save(string nf)
  92. {
  93. using var f = new FileStream( nf, FileMode.Create );
  94. var opts = new JsonSerializerOptions {
  95. ReferenceHandler = ReferenceHandler.Preserve
  96. };
  97. JsonSerializer.Serialize( f, this.Biblioteca, opts );
  98. }
  99.  
  100. public static Biblioteca? Load(string nf)
  101. {
  102. using var f = new FileStream( nf, FileMode.Open );
  103. var opts = new JsonSerializerOptions {
  104. ReferenceHandler = ReferenceHandler.Preserve
  105. };
  106.  
  107. //opts.Converters.Add( new BibliotecaJsonConverter() );
  108. //opts.Converters.Add( new AutorJsonConverter() );
  109. return JsonSerializer.Deserialize<Biblioteca>( f, opts );
  110. }
  111. }
  112.  
  113.  
  114. public class BibliotecaJsonConverter: JsonConverter<Biblioteca> {
  115. public override Biblioteca? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  116. {
  117. Biblioteca? toret = null;
  118. string nombre = "";
  119. ICollection<Autor>? autores = new List<Autor>();
  120.  
  121. reader.Read();
  122. if ( reader.TokenType == JsonTokenType.PropertyName
  123. && reader.ValueTextEquals( "Nombre" ) )
  124. {
  125. reader.Read();
  126. nombre = reader.GetString() ?? "";
  127. reader.Read();
  128. autores = JsonSerializer.Deserialize<ICollection<Autor>>(ref reader, options);
  129.  
  130. toret = new Biblioteca { Nombre = nombre };
  131. foreach (var autor in autores ?? new List<Autor>())
  132. {
  133. toret.Inserta( autor );
  134. }
  135.  
  136. reader.Read(); // endobject
  137. reader.Read();
  138. }
  139.  
  140. return toret;
  141. }
  142.  
  143. public override void Write(Utf8JsonWriter writer, Biblioteca value, JsonSerializerOptions options)
  144. {
  145. throw new NotImplementedException();
  146. }
  147. }
  148.  
  149.  
  150. public class AutorJsonConverter: JsonConverter<Autor> {
  151. public override Autor? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  152. {
  153. Autor? toret = null;
  154. string nombre = "";
  155. int annonac = 1451; // se inventa la imprenta
  156. ICollection<Libro>? libros = new List<Libro>();
  157.  
  158. reader.Read();
  159. while ( reader.TokenType != JsonTokenType.EndObject ) {
  160. if ( reader.TokenType == JsonTokenType.PropertyName
  161. && reader.ValueTextEquals( "Nombre" ) )
  162. {
  163. reader.Read();
  164. nombre = reader.GetString() ?? "";
  165. }
  166. else
  167. if ( reader.TokenType == JsonTokenType.PropertyName
  168. && reader.ValueTextEquals( "AnnoNac" ) )
  169. {
  170. reader.Read();
  171. annonac = reader.GetInt32();
  172. }
  173. else
  174. if ( reader.TokenType == JsonTokenType.PropertyName
  175. && reader.ValueTextEquals( "Libros" ) )
  176. {
  177. libros = JsonSerializer.Deserialize<ICollection<Libro>>(ref reader, options);
  178.  
  179. toret = new Autor {
  180. Nombre = nombre,
  181. AnnoNac = annonac };
  182.  
  183. foreach (var libro in libros ?? new List<Libro>())
  184. {
  185. toret.Inserta( libro );
  186. }
  187. }
  188.  
  189. reader.Read();
  190. }
  191.  
  192. return toret;
  193. }
  194.  
  195. public override void Write(Utf8JsonWriter writer, Autor value, JsonSerializerOptions options)
  196. {
  197. throw new NotImplementedException();
  198. }
  199. }
  200.  
  201.  
  202. class Test {
  203. static void Main()
  204. {
  205. var biblio = new Biblioteca { Nombre = "Universitaria UVigo" };
  206. var julio = new Autor { Nombre = "Julio Verne", AnnoNac = 1828 };
  207. var alex = new Autor { Nombre = "Alejandro Dumas", AnnoNac = 1802 };
  208.  
  209. biblio.Inserta( julio )
  210. .Inserta( alex );
  211.  
  212. var libro1 = new Libro {
  213. Titulo = "Viaje al centro de la tierra",
  214. Autor = julio,
  215. Formato = Libro.Tipo.Bolsillo,
  216. Isbn = "978-8468253572",
  217. Pags = 330
  218. };
  219.  
  220. var libro2 = new Libro {
  221. Titulo = "Los tres mosqueteros",
  222. Autor = alex,
  223. Formato = Libro.Tipo.TapaBlanda,
  224. Isbn = "978-8491052401",
  225. Pags = 617
  226. };
  227.  
  228. var libro3 = new Libro {
  229. Titulo = "La vuelta al mundo en ochenta días",
  230. Autor = julio,
  231. Formato = Libro.Tipo.TapaDura,
  232. Isbn = "978-8431662950",
  233. Pags = 384
  234. };
  235.  
  236. julio.Inserta( libro1 )
  237. .Inserta( libro3 );
  238. alex.Inserta( libro2 );
  239.  
  240. Console.WriteLine( biblio );
  241. new JsonBiblioteca{ Biblioteca = biblio }.Save( "biblio.json" );
  242.  
  243. Console.WriteLine( "Lectura:" );
  244. var biblio2 = JsonBiblioteca.Load( "biblio.json" );
  245. Console.WriteLine( biblio2 );
  246. }
  247. }
  248.  
Success #stdin #stdout 0.15s 36564KB
stdin
Standard input is empty
stdout
Universitaria UVigo
Julio Verne (1828)
Julio Verne: Viaje al centro de la tierra (ISBN: 978-8468253572, 330 pgs.)
Julio Verne: La vuelta al mundo en ochenta días (ISBN: 978-8431662950, 384 pgs.)
Alejandro Dumas (1802)
Alejandro Dumas: Los tres mosqueteros (ISBN: 978-8491052401, 617 pgs.)
Lectura:
Universitaria UVigo
Julio Verne (1828)
Julio Verne: Viaje al centro de la tierra (ISBN: 978-8468253572, 330 pgs.)
Julio Verne: La vuelta al mundo en ochenta días (ISBN: 978-8431662950, 384 pgs.)
Alejandro Dumas (1802)
Alejandro Dumas: Los tres mosqueteros (ISBN: 978-8491052401, 617 pgs.)