Ошибка при разборе json с классом Kotlin Android - PullRequest
0 голосов
/ 01 ноября 2019

привет, я пытаюсь проанализировать JSON с kotlin

ниже мой код json

    [{
    "module":"1",
    "books":[{"name":"bookname1","authors":"author1, author 2"},
             {"name":"bookname2","authors":"author1, author 2"},
             {"name":"bookname3","authors":"author1, author 2"}]
},
{
    "module":"2",
    "books":[{"name":"bookname1","authors":"author1, author 2"},
             {"name":"bookname2","authors":"author1, author 2"},
             {"name":"bookname3","authors":"author1, author 2"}]
},
{
    "module":"3",
    "books":[{"name":"bookname1","authors":"author1, author 2"},
             {"name":"bookname2","authors":"author1, author 2"},
             {"name":"bookname3","authors":"author1, author 2"}]
},
{
    "module":"4",
    "books":[{"name":"bookname1","authors":"author1, author 2"},
             {"name":"bookname2","authors":"author1, author 2"},
             {"name":"bookname3","authors":"author1, author 2"}]
},
{
    "module":"5",
    "books":[{"name":"bookname1","authors":"author1, author 2"},
             {"name":"bookname2","authors":"author1, author 2"},
             {"name":"bookname3","authors":"author1, author 2"}]
}]

обратите внимание, что этот ответ 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

}

А вот и мой код

//interface

interface SemdetailsFetcher {
    @GET("test/json/sub1.json")
    fun getCurrentSemData(): Call<SemdetailsPArser>
}

Вот мой код в действии

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)
                }
            }


        })
    }

и я получаю эту ошибку

here 3 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

Я понял, что это может быть связано с моим классом синтаксического анализа

здесь я получаю массив информации JSON, я пробовал тот же код с другим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
}

это работало отлично, когда я изменил класс синтаксического анализа и интерфейс

Моя проблема в том, что я не знаю, как написать класс для анализа ответа json, начинающегося с массива

Ответы [ 3 ]

1 голос
/ 01 ноября 2019

Полученная ошибка означает, что вы пытаетесь проанализировать массив JSON, думая, что это должен быть объект JSON. Массив JSON находится между этими [], тогда как объект JSON находится в фигурных скобках, подобных этим {}. Итак, ваш первый JSON соответствует чему-то вроде List<Module>, это не объект, а их список. В каждом модуле есть список книг.

Итак, все сказано, так и должно быть

interface SemdetailsFetcher {
    @GET("test/json/sub1.json")
    fun getCurrentSemData(): Call<List<SemdetailsPArser>>
}

Кстати, если вы правильно определите свои POJO, вам не понадобятся все аннотации.

1 голос
/ 01 ноября 2019

Вы ожидаете список SemdetailsPArser, поэтому вы должны определить тип возвращаемого значения как Список SemdetailsPArser

. Это должно решить проблему.

interface SemdetailsFetcher {
    @GET("test/json/sub1.json")
    fun getCurrentSemData(): Call<List<SemdetailsPArser>>
}

Вам также необходимо изменить егов других частях кода.

0 голосов
/ 01 ноября 2019

Создать класс SemdetailsPArser

data class SemdetailsPArser( val books: List<Book>, val module: String )

Следующее создание класса Книги

data class Book(
val authors: String,
val name: String

)

следующий в интерфейсе (SemdetailsFetcher)

interface SemdetailsFetcher {
@GET("test/json/sub1.json")
fun getCurrentSemData(): Call<List<SemdetailsPArser>>

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...