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

[Dúvida] Exception quando passado o JSON do response.

Criei minha função main da seguinte forma:

fun main() {
    val client: HttpClient = HttpClient.newHttpClient()
    val request = HttpRequest.newBuilder()
        .uri(URI.create("https://www.cheapshark.com/api/1.0/deals?storeID=1&upperPrice=15"))
        .build()

    val response = client.send(request, BodyHandlers.ofString())
    val jsonJogo = response.body()
    println(jsonJogo)

    val gson = Gson()
    val meuJogo = gson.fromJson(
        jsonJogo,
        Jogo::class.java
    )
    println(meuJogo)

}

Minha classe Jogo está da seguinte forma:

class Jogo {
    @SerializedName("title") val nomeJogo: String? = null
    @SerializedName("thumb") val imagemJogo: String? = null
}

Porém quando estou rodando o código está dando o seguinte erro. java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path

Ja testei tudo que encontrei na internet, fiz até mesmo um JSON manual para teste e não aceita. Alguém passou por esse problema? Ou Instrutores sabem como resolver?

3 respostas
solução!

O erro java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY ocorre quando o Gson espera receber um objeto JSON, mas encontra um array JSON. Isso sugere que a resposta da API está retornando um array de objetos JSON, em vez de um único objeto.

Para corrigir esse erro, você precisa ajustar o seu código para lidar com um array de objetos JSON. Você pode fazer isso da seguinte maneira:

Se você deseja obter apenas o primeiro jogo do array, pode modificar seu código para pegar o primeiro elemento do array

val meuJogo = gson.fromJson(
    jsonJogo,
    Array<Jogo>::class.java
)[0]

Neste caso, você está convertendo o JSON em um array de objetos Jogo e pegando o primeiro elemento desse array.

OU

Se você deseja processar todos os jogos do array, pode modificar seu código para lidar com um array de objetos JSON diretamente

val meuJogos = gson.fromJson(
    jsonJogo,
    Array<Jogo>::class.java
)
meuJogos.forEach { jogo ->
    println(jogo)
}

Neste caso, você está convertendo o JSON em um array de objetos Jogo e iterando sobre cada elemento do array.

testa ai e me fala!

Cara muito boom! Foi muito claro e funcionou muito bem! A unica coisa que deu no código da forma que passou foi que ao invés de trazer as propriedades do jogo foi retornado os hash da classe Jogo, para resolver só alterei a classe para um data class e funcionou.

data class Jogo ( @SerializedName("title") val nomeJogo: String? = null, @SerializedName("thumb") val imagem: String? = null )

Muito obrigado!

É isso ai Leonardo, programação é assim mesmo, e sendo sincero assim que se apreende, com os erros, vc arrumando oque estava errado, sucesso nos estudos ai mano!!