No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Importando datos

8/26
Recursos

Aportes 15

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 鈥渂ooks.json鈥 se lo guarde en la carpeta /bin/Debug/net para que no les de error al momento de extraer los datos.

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

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

  • Books.json contiene la informaci贸n en 鈥渂ruto鈥
  • 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.

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.

Para serializar us茅 la librer铆a NewtonSoft, estaba acostumbrado a ella y el c贸digo me quedo as铆

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

鈥渰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.

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());
    }
}
![](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));`
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>

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