salut j'essaye d'analyser JSON avec kotlin
voici mon code json
{
"person": {
"name": "Don",
"age": 35
},
"books": [{
"id": 800,
"name": "book 1",
"description": "clear sky",
"icon": "01n"
},
{
"id": 801,
"name": "book 2",
"description": "clear sky 1",
"icon": "01N"
}
],
"city": "bgvnslsl",
"id": 1851632,
"bname": "abcd",
"code": 200
}
veuillez noter que cette réponse json commence par array
voici ma classe pour l'analyser
here 3 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
Et voici mon code
// interface
XXX
voici mon code en activité
fun getCurrentData() {
val retrofit = Retrofit.Builder()
.baseUrl(BaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
val service = retrofit.create(SemdetailsFetcher::class.java)
val call = service.getCurrentSemData()
call.enqueue(object : Callback, retrofit2.Callback<SemdetailsPArser> {
override fun onResponse(
call: retrofit2.Call<SemdetailsPArser>?,
response: retrofit2.Response<SemdetailsPArser>?
) {
// val thisthig = response?.body();
println("here 1 ${response?.body().toString()}")
}
override fun onFailure(call: Call?, e: IOException?) {
println("here 2")
}
override fun onFailure(call: retrofit2.Call<SemdetailsPArser>?, t: Throwable?) {
println("here 3 $t")
}
override fun onResponse(call: Call, response: Response) {
if (response.code() == 200) {
println("secodn success")
val sampleResp = response.body()!!
println(sampleResp)
}
}
})
}
et j'obtiens cette erreur
interface SemdetailsFetcher {
@GET("test/json/sub1.json")
fun getCurrentSemData(): Call<SemdetailsPArser>
}
J'ai compris que cela pourrait être lié à ma classe d'analyse
ici je reçois un tableau d'informations json, j'ai essayé le même code avec un autre json
class SemdetailsPArser {
@SerializedName("module")
@Expose
var module: String? = null
@SerializedName("books")
@Expose
var books: List<Book>? = null
}
class Book {
@SerializedName("name")
@Expose
var name: String? = null
@SerializedName("authors")
@Expose
var authors: String? = null
}
cela fonctionnait parfaitement quand j'ai changé la classe d'analyse et l'interface
Mon problème est que je ne sais pas comment écrire une classe pour analyser une réponse json commençant par un tableau
p >
3 Réponses :
Vous attendez une liste de SemdetailsPArser , vous devez donc définir le type de retour comme Liste de SemdetailsPArser
Cela devrait résoudre le problème.
interface SemdetailsFetcher {
@GET("test/json/sub1.json")
fun getCurrentSemData(): Call<List<SemdetailsPArser>>
}
Vous devez également le modifier dans d'autres parties du code.
L'erreur que vous obtenez signifie que vous essayez d'analyser le tableau JSON, pensant qu'il devrait s'agir d'un objet JSON. Le tableau JSON est la chose entre ces [] , tandis que l'objet JSON est entre accolades comme ceux-ci {} . Donc votre premier JSON correspond à quelque chose comme List, ce n'est pas un objet, mais une liste d'entre eux. Chaque module contient une liste de livres.
Donc tout dit, ça devrait être comme ça
interface SemdetailsFetcher {
@GET("test/json/sub1.json")
fun getCurrentSemData(): Call<List<SemdetailsPArser>>
}
Au fait, si vous définissez correctement vos POJO, vous n'aurez pas besoin de toutes les annotations. p >
merci, la façon dont j'ai appelé la classe était fausse, si insouciante de ma part, m'a coûté un jour
Créer la classe SemdetailsPArser
classe de données SemdetailsPArser (
val books: Liste
Ensuite, créez la classe Book
interface SemdetailsFetcher {
@GET("test/json/sub1.json")
fun getCurrentSemData(): Call<List<SemdetailsPArser>>
)
suivant dans l'interface (SemdetailsFetcher)
data class Book( val authors: String, val name: String
}
votre analyse ne fonctionnera pas car votre réponse est un tableau json et le code que vous avez écrit attend une réponse d'objet json
oui exactement, j'ai compris cela, pouvez-vous nous éclairer sur la façon d'y parvenir? J'ai essayé le générateur gson en ligne, la classe ci-dessus est générée avec la même entrée json