Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Dificuldades em converter de forma correta o JSON

Olá, estou praticando o uso de API com uma aplicação de previsão de tempo usando a chave API da WeatherAPI.com. O output do JSON vem corretamente, criei a classe record para traduzir o JSON mas mesmo assim a saída está ficando assim:

WeatherTradutor[name=null, temp_c=0.0, conditionText=null]

Minha classe record:

package Modelos;

public record WeatherTradutor (String name, double temp_c, String conditionText) {

}

Minha Classe Main:

package Main;

import API.WeatherAPI;

import Modelos.WeatherTradutor;

import com.google.gson.Gson;

import com.google.gson.JsonSyntaxException;


import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {

        Scanner scanner = new Scanner(System.in);

        System.out.println("Informe a cidade:");
        String city = scanner.nextLine();
        city = city.toLowerCase();
        city = city.replace(" ", "%20");


        String weatherForecast = WeatherAPI.getWeatherForecast(city);
        String json = weatherForecast;
        System.out.println(json);

        try {
            Gson gson = new Gson();
            WeatherTradutor weather = gson.fromJson(json, WeatherTradutor.class);
            System.out.println(weather);



        } catch (JsonSyntaxException e) {
            System.out.println("Erro na conversão");
            System.out.println(e.getMessage());
        }
    }
}
2 respostas

Olá Robson,

Pelo seu código, parece que você está usando a biblioteca Gson para fazer a conversão do JSON para a classe WeatherTradutor. Uma possibilidade é que o problema esteja na correspondência dos nomes dos campos do JSON com os nomes dos campos da classe WeatherTradutor.

Verifique se os nomes dos campos do JSON estão exatamente iguais aos nomes dos campos da classe WeatherTradutor. Caso contrário, você pode usar a anotação @SerializedName para indicar qual é o nome do campo no JSON correspondente ao campo da classe.

Por exemplo, se o nome do campo no JSON é temp_celsius e o nome do campo na classe é temp_c, você pode usar a anotação assim:

public record WeatherTradutor (String name, @SerializedName("temp_celsius") double temp_c, String conditionText) {

}

Espero ter ajudado e bons estudos!

solução!

Ainda assim não funcionou, mas percebi que o erro estava na forma que o JSON apresentava as informações aninhadas. Tive que lançar mão do jsonObject na Classe Main para poder mapear e manipular corretamente as informações do JSON e é claro deixar de utilizar a classe WeatherTradutor como record e tratar como uma classe normal e descrevendo suas características e métodos. Obrigado pela ajuda @Matheus Brandino!!!! Ficou assim:

O JSON vem nesse formato (adaptei para ficar melhor entendido):

{
"location":


{"name":"Salvador",
"region":"Bahia",
"country":"Brazil",
},

{"current":
{"last_updated_epoch":1687376700,
"last_updated":"2023-06-21 16:45",
"temp_c":26.0,
"temp_f":78.8,
"is_day":1,
"condition":{"text":"Parcialmente nublado"
}

Classe Main

package Main;

import API.WeatherAPI;

import Modelos.WeatherTradutor;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;


import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {

        Scanner scanner = new Scanner(System.in);

        System.out.println("Informe a cidade:");
        String city = scanner.nextLine();
        city = city.toLowerCase();
        city = city.replace(" ", "%20");


        String weatherForecast = WeatherAPI.getWeatherForecast(city);
        String json = weatherForecast;
        //ystem.out.println(json);

        try {
            Gson gson = new Gson();

            JsonParser parser = new JsonParser();
            JsonObject jsonObject = parser.parse(json).getAsJsonObject();
            WeatherTradutor weatherTradutor = new WeatherTradutor();
            weatherTradutor.setName(jsonObject.get("location").getAsJsonObject().get("name").getAsString());
            weatherTradutor.setTemp_c(jsonObject.get("current").getAsJsonObject().get("temp_c").getAsDouble());
            weatherTradutor.setConditionText(jsonObject.get("current").getAsJsonObject().get("condition").getAsJsonObject().get("text").getAsString());

            System.out.println("Cidade: " + weatherTradutor.getName());
            System.out.println("Temperatura: " + weatherTradutor.getTemp_c() + "°C");
            System.out.println("Condição: " + weatherTradutor.getConditionText());

        } catch (JsonSyntaxException e) {
            System.out.println("Erro na conversão");
            System.out.println(e.getMessage());
        }


    }
}

Classe WeatherTradutor:

package Modelos;

public class WeatherTradutor {
    private String name;
    private double temp_c;
    private String conditionText;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getTemp_c() {
        return temp_c;
    }

    public void setTemp_c(double temp_c) {
        this.temp_c = temp_c;
    }

    public String getConditionText() {
        return conditionText;
    }

    public void setConditionText(String conditionText) {
        this.conditionText = conditionText;
    }
}