2
respostas

Conversão para JSON não funciona

Na main, estou tendo um problema na hora de criar a seguinte variável:

String CEP = userInput;

CheckCep userInfo = new CheckCep();

CepInfo jsonAsObjectOfCepInfo = userInfo.returnCepInfo(CEP); ---> erro

userInput é o CEP que o usuário insere; CepInfo é a classe record; e CheckCep é a classe contendo a função returnCepInfo, que faz todo o processo da requisição e conversão para JSON, e retorna um objeto da classe CepInfo. Aqui está a classe CheckCep:

package br.com.alura.models;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;
import java.lang.reflect.Type;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class CheckCep {

    public CepInfo returnCepInfo(String cep) throws IOException, InterruptedException {

        String URL = "https://viacep.com.br/ws/"+cep+"/json/";
        Gson gson = new GsonBuilder().create();

        HttpClient client = HttpClient.newHttpClient();

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(URL))
                .build();

        HttpResponse<String> response = client
                .send(request, HttpResponse.BodyHandlers.ofString());


        String jsonFileWithAddress = response.body();

        CepInfo jsonAsObjectOfCepInfo = gson.fromJson(jsonFileWithAddress, CepInfo.class);

        return jsonAsObjectOfCepInfo;
    }


}

Quando eu rodo a classe main, a seguinte mensagem aparece:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:397)
    at com.google.gson.Gson.fromJson(Gson.java:1227)
    at com.google.gson.Gson.fromJson(Gson.java:1137)
    at com.google.gson.Gson.fromJson(Gson.java:1047)
    at com.google.gson.Gson.fromJson(Gson.java:982)
    at br.com.alura.models.CheckCep.returnCepInfo(CheckCep.java:32)
    at br.com.alura.models.Main.main(Main.java:68)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:393)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:386)
    ```
    
    
    
A linha 32 da classe CheckCep é onde há a conversão de JSON para CepInfo:


    ```
    CepInfo jsonAsObjectOfCepInfo = gson.fromJson(jsonFileWithAddress, CepInfo.class);
    ```
    

Pelo que tudo indica, há um problema com a conversão, mas eu não faço ideia qual.
2 respostas

os nomes dos atributos e a estrutura da classe CepInfo estao iguais ao json enviado pelo via cep? voce ja verificou se o tipo retornado pelo response.body() é uma string ? porque pode ser um path um array de bytes e uma string

Sim, eu usei o @SerializedName na classe record, como você pode ver a seguir:

public record CepInfo(
        @SerializedName("cep") String cep,
        @SerializedName("logradouro") String logradouro,
        @SerializedName("complemento") String complemento,
        @SerializedName("bairro") String bairro,
        @SerializedName("localidade") String localidade,
        @SerializedName("uf") String uf,
        @SerializedName("ibge") String ibge,
        @SerializedName("gia") String gia,
        @SerializedName("ddd") String ddd,
        @SerializedName("siafi") String siafi) {
}

E eu fiz a função CheckCep retornar o seguinte

return response.body() instanceof String

E ao testar na main, o resultado foi true