No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Importando datos

8/26
Recursos

Aportes 17

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En el constructor de la clase LinqQueries el editor indica que hay un warning.
Si la clase JsonSerializer no puede deserializar el JSON devuelve NULL.
Para evitar ese warning hacemos lo siguiente:

  1. Le colocamos el operador ! que indica que el dato es non-nullable.
JsonSerializer.Deserialize<List<Book>>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true })!
  1. Asignamos un valor por default si la deserialización devuelve NULL.
    Estoy creando una lista vacía.
JsonSerializer.Deserialize<List<Book>>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }) ?? Enumerable.Empty<Book>().ToList();

Para las personas que estén trabajando con Visual Studio Comunity es recomendable que el archivo “books.json” se lo guarde en la carpeta /bin/Debug/net para que no les de error al momento de extraer los datos.

Explicado de una forma más simple el profesor ha hecho lo siquiente:

  • Books.json contiene la información en “bruto”
  • Book.cs traslada los datos del json a C#
  • LinqQueries<Book> es una coleccion de Book, es decir, que funciona como un contenedor de libros.

Por lo tanto el esquema de tratamiento de datos es el siguiente:

  1. Cogemos los datos del .json y los seleccionamos con el archivo book.cs
  2. Creamos una clase contenedora de libros que es LinqQuery<book> y le damos una funcion que retorne todos los libros: TodaLaColeccion()

Books.json son los datos en bruto, Book.cs es la caja que ordena los datos y LinqQueries<Book> es el contenedor de cajas con funciones.

Espero que alguien le ayude a entenderlo mejor.

public class Book
{
public string? Title {get;set;}
public int PageCount {get;set;}
public string? Status {get;set;}
public DateTime PublishedDate {get;set;}
public string[]? Authors {get;set;}
public string[]? Categories {get;set;}
}

falto la clase e importante ponerlos signos de Interrogacion para los valores nulos… Buen aporte @Mairon Andres

Para serializar usé la librería NewtonSoft, estaba acostumbrado a ella y el código me quedo así

“{0, -60} {1, 9} {2, 11}\n”: Es un string de formato compuesto que se utiliza para controlar cómo se formatea la salida. Los números entre las llaves {} son índices que corresponden a los argumentos que se proporcionarán después de la cadena de formato. Los números después de las comas controlan el ancho mínimo de cada campo. Un número negativo, como en {0, -60}, indica que el campo se alineará a la izquierda. Un número positivo, como en {1, 9}, indica que el campo se alineará a la derecha. En este caso, el formato indica que el primer campo debe ocupar al menos 60 caracteres, el segundo campo debe ocupar al menos 9 caracteres y el tercer campo debe ocupar al menos 11 caracteres.

Yo se que este no es un curso de C#, pero me parece que el profesor no esta explicando nada,esta solamente desarrollando un ejercicio para el misimo, y no estoy de acuerdo, este tiepo de cursos asi es muy reiterativo en Platzi, es dificil llevar el ritmo en ocasiones.

Deberiamos guardar el formato de la tabla en una variable en vez de quemar el valor en 2 lugares diferentes.

using Curso_Linq;

internal class Program
{
    private static void Main(string[] args)
    {
        LinqQueries queries = new LinqQueries();

        string formatoTexto = "{0, -60} {1, 15} {2, 15}";

        void ImprimirValores(IEnumerable<Book> listaDeLibros)
        {
            Console.WriteLine($"{formatoTexto}\n", "Titulo", "N. Paginas", "Fecha publicacion");
            foreach (var book in listaDeLibros)
            {
                Console.WriteLine($"{formatoTexto}", book.Title, book.PageCount, book.PublishedDate.ToShortDateString());
            }
        }

        ImprimirValores(queries.TodaLaColeccion());
    }
}

Como aporte, hice algunos cambios al código propuesto agregando primero que todo como una constante de tipo string para guardar la ubicación del archivo json, segundo en el constructor agrego dos validaciones siendo la primera en la línea 9 para confirmar que si existe el archivo para poder leerlo, la segunda en la línea 14 para validar que el archivo tenga contenido y por ultimo dejo dentro de la misma clase el método de imprimir para que solo desde el método Program después de inicializar se haga el llamada al método. En la imagen se muestra todo el contenido mencionado

Código de la clase LinqQueries.cs

Código del Program.cs

Resultado del Código

Vista Completa desde el editor

Para los que tengan error en visual studio community: ```js <ItemGroup> <Content Include="books.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> ```\<ItemGroup> \<Content Include="books.json"> \<CopyToOutputDirectory>PreserveNewest\</CopyToOutputDirectory> \</Content> \</ItemGroup>
![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-09-10%20a%20la%28s%29%209.56.25p.m.-e14d9f0f-4e3f-4d3f-8aa8-a6c07f7da811.jpg) Decidi agregar una columna mas a la consola :)
Me sucedio en .net 8 que no se copiaba el archivo books.json al directorio de debug apesar de seccionarlo como recurso en el XML con visual studio community, lo que se hizo es ver las propidades del archivo y seleccionar copiar siempre o editar el XML ![](https://static.platzi.com/media/user_upload/image-a23f53b0-bb50-4ab8-a774-ce4a67460102.jpg) `<ItemGroup>` ` <Content Include="books.json">` ` <CopyToOutputDirectory>Always</CopyToOutputDirectory>` ` </Content>` `</ItemGroup>`
![](https://static.platzi.com/media/user_upload/image-2c3b1bec-fcaf-4c71-a77b-46d0e1fa8511.jpg)![]()```js Con dotnet watch se compila el proyecto en tiempo real sin estar recompilando manualmente. ```![](https://static.platzi.com/media/user_upload/image-71d3f7ad-da1c-458e-af51-c23c5dfb5463.jpg)
Si quieren ponerle una línea que separe el encabezado del cuerpo de la tabla, quiten el salto de línea de la cabecera y pongan el siguiente código: `Console.WriteLine(new string('-', 90));`

Al ejecutar el código me estaba saliendo el siguiente error:

System.Text.Json.JsonException: ''/' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.'

Investigando un poco, esto se debe a que cualquier operación de serialización o deserialización usando System.Text.Json no admite ningún comentario en JSON (Y nuestro JSON tiene comentarios al inicio jeje). Por tanto la solución es simplemente agregar la siguiente opción

ReadCommentHandling = JsonCommentHandling.Skip

:

Por tanto el código, quedaría así:

this.librosCollection = System.Text.Json.JsonSerializer.Deserialize<List<Book>>(json, new System.Text.Json.JsonSerializerOptions() { PropertyNameCaseInsensitive = true, ReadCommentHandling = JsonCommentHandling.Skip });

Referencia: https://www.thecodebuzz.com/system-text-json-allows-comments-trailing-commas-serialize-deserialize/

Hola, aun despues de colocar lo siguiente: ![](https://static.platzi.com/media/user_upload/image-31434895-0e41-4968-80b5-86f47a98cd62.jpg), Sigo teniendo el siguiente error: ![](https://static.platzi.com/media/user_upload/image-de77e242-2ca3-4d90-a2b1-2884b0da7ade.jpg)

Para que te quede ordenado, puedes aplicar una tablucaión con el caracter \t

Console.WriteLine("{0, -70}\t{1, 7}\t{2, 11}\n", "Titulo", "N. Paginas", "Fecha Publicación");
foreach(var item in listaDeLibros){
    Console.WriteLine("{0, -70}\t{1, 7}\t\t{2, 11}", item.Title, item.PageCount, item.PublishedDate);