3
respostas

[Bug] Problemas nas informações do JSON

Nos exercícios que são propostos no segundo capítulo do curso C#: consumindo API, gravando arquivos e utilizando o LINQ o JSON do exercício do Filme e o do Livro há inconsistência nos dados numéricos, o do Filme não é possível pegá-los como inteiros não consegui descobri o motivo, só consegui acessá-los como string, e o do Livro falta aspas em cada dado númerico (ano_publicacao) e (paginas) não consegui acessar eles nem como int nem como string.

3 respostas

Olá, Renan! Tudo bem?

No caso do JSON do Filme, os dados numéricos estão sendo interpretados como string. Isso pode acontecer quando os dados numéricos estão entre aspas no JSON. Por exemplo, se o JSON estiver assim:

{
  "titulo": "O Poderoso Chefão",
  "ano": "1972"
}

Nesse caso, o campo "ano" está entre aspas, o que faz com que seja interpretado como string. Para corrigir isso, você pode tentar converter a string para um número inteiro após a desserialização, usando o método int.Parse() ou int.TryParse().

No caso do JSON do Livro, parece que os dados numéricos não estão entre aspas, o que é o correto para dados numéricos em JSON. Se os dados estiverem assim:

{
  "titulo": "1984",
  "ano_publicacao": 1949,
  "paginas": 328
}

Nesse caso, os campos "ano_publicacao" e "paginas" estão corretos. Se você não está conseguindo acessar esses campos nem como int, nem como string, pode ser que haja algum problema na sua classe Livro. Verifique se os tipos dos campos correspondem aos tipos dos dados no JSON e se os nomes dos campos estão corretos.

Espero ter ajudado e caso tenha mais problemas, estarei à disposição para ajudá-lo.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

No caso filme ainda há essa solução fazer a conversão após a deserealização, mas o problema do livro não consegui. Esta é a minha classe Livro

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;

namespace TesteAPI5.Models;

internal class Livro
{
    [JsonPropertyName("titulo")]
    public string? Titulo { get; set; }
    [JsonPropertyName("autor")]
    public string? Autor { get; set;}
    [JsonPropertyName("ano_publicacao")]
    public string? Ano { get; set; }
    [JsonPropertyName("genero")]
    public string? Genero { get; set; }
    //[JsonPropertyName("paginas")]
    //public string? Paginas { get; set;}
    [JsonPropertyName("editora")]
    public string? Editora { get; set;}

    public string Informacoes => $"Titulo: {Titulo}; Autor: {Autor}; Genero: {Genero}; Editora: {Editora};";
}

E a minha classe program está basicamente igual a que foi ensinada no curso.

using System.Text.Json;
using TesteAPI5.Models;

using (HttpClient client = new HttpClient())
{
    string endPoint = "https://raw.githubusercontent.com/ArthurOcFernandes/Exerc-cios-C-/curso-4-aula-2/Jsons/Livros.json";
    try
    {
        string resposta = await client.GetStringAsync(endPoint);
        var livros = JsonSerializer.Deserialize<List<Livro>>(resposta)!;
        foreach ( var livro in livros)
        {
            Console.WriteLine(livro.Informacoes);
        }
    }
    catch(Exception ex)
    {
        Console.WriteLine($"Houve um erro: {ex.Message}");
    }
}

Mensagem da exceção: Houve um erro: The JSON value could not be converted to System.String. Path: $[0].ano_publicacao | LineNumber: 4 | BytePositionInLine: 30.

Não consegui indentificar o motivo da exceção estar sendo lançada, se conseguir indentificar. Desde já agradeço a atenção.

Boa tarde, Renan! Tudo bem?

Peço desculpas pela demora em retornar.

Dentro do código que você compartilhou não consegui identificar nenhuma inconsistência que poderia levar ao erro que você comentou. Por isso, peço que compartilhe todo o seu projeto, via GitHub ou Drive do Google. Assim conseguirei realizar testes, a fim de encontrar onde está sendo causado o erro.

Abraços,

Fico no aguardo e à disposição

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software