0
votes

Erreur lors de l'analyse de json avec la classe Kotlin Android

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 >


2 commentaires

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


3 Réponses :


1
votes

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.


0 commentaires

1
votes

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 >


1 commentaires

merci, la façon dont j'ai appelé la classe était fausse, si insouciante de ma part, m'a coûté un jour



0
votes

Créer la classe SemdetailsPArser

classe de données SemdetailsPArser ( val books: Liste , module val: chaîne )

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

}


0 commentaires