Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Bug] Um erro muito maior do que o apresentado no vídeo!

Meu código deu um problema gigantesco mil vezes maior do que o erro proposital apresentado nas aulas:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 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 MainKt.main(Main.kt:30)
    at MainKt.main(Main.kt)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:393)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:386)
    ... 6 more

A única linha do erro que me indica algo dentro do código, é a linha 30, que possui o código abaixo val meuinfoJogo = gson.fromJson(json, infoJogo::class.java) :

1 resposta
solução!

Olá, Fabrício, tudo bem?

Pelo erro, acredito que a sua data class está diferente dos atributos retornados pelo json.

Exemplo, se o meu json vem assim:

{
  "info": {
    "title": "STEINS;GATE",
    "steamAppID": "412830",
    "thumb": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/412830/capsule_sm_120.jpg?t=1715703398"
  },
  "cheapestPriceEver": {
    "price": "11.99",
    "date": 1534446729
  },
  "deals": [
    {
      "storeID": "1",
      "dealID": "niXrsAcK%2FHsMB0ytxc4kvgV%2FIbw1DUsRyp7RiBEzoOs%3D",
      "price": "29.99",
      "retailPrice": "29.99",
      "savings": "0.000000"
    }
  ]
}

Logo, meu data class tem que ser assim:

InfoJogo.kt

data class InfoJogo(val info: Info, val cheapestPriceEver: CheapestPriceEver, val deals: Array<Deal>) 

Note que dentro alí dos atributos tem outras classes, assim como no meu json que ele retorna outros objetos. Então as outras data classes seriam assim:

Info.kt

data class Info (val title: String, val steamAppID: String, val thumb: String)

CheapestPriceEver.kt

data class CheapestPriceEver(val price: Double, val date: Long)

Deal.kt

data class Deal(val storeID: Int, val price: Double, val retailPrice: Double)

Observe que todos acompanham os EXATOS mesmos atributos, com os nomes dos atributos IDÊNTICOS. Note também que no json, o deals é trazido por colchetes ([]), ou seja, precisa ser declarado como array, da mesma forma que é declarado no InfoJogo.tk do meu exemplo em: Array<Deal>

Suponho isso porque o seu erro descreve arrays.

Expected BEGIN_OBJECT but was BEGIN_ARRAY

Uma outra possibilidade é: caso o seu json venha como um array direto, que é o caso do endpoint /games?title.

Neste, caso, teria que fazer assim:

val meusJogos = gson.fromJson(json, Array<infoJogos>::class.java)

Porém o endpoint /games?title recebe outros atributos e teria que criar um outra classe. Que seria esta:

data class infoJogos(val gameID: Int, val steamAppID: Int, val cheapest: Double, val cheapestDealID: String, val external: String, val internalName: String, val thumb: String)

Mas como o endpoint usado pela aula é o /games?i, provavelmente a causa do erro possa ser resolvida com a primeira sugestão que fiz.