(Kotlin) GSON неверный анализ ответа от массива json - PullRequest
0 голосов
/ 23 октября 2019

Моя проблема похожа на GSON parse Json Array , но кажется устаревшей для старого способа использования. И я не могу получить от него ответ.

Я анализирую URL с ответом json, который возвращает массив

[{
    "flight_number": 1,
    "mission_name": "FalconSat",
    "mission_id": [],
    "upcoming": false,
    "launch_year": "2006",
    "launch_date_unix": 1143239400,
    "launch_date_utc": "2006-03-24T22:30:00.000Z",
    "launch_date_local": "2006-03-25T10:30:00+12:00",
    "is_tentative": false,
    "tentative_max_precision": "hour",
    "tbd": false,
    "launch_window": 0,
    "rocket": {
        "rocket_id": "falcon1",
        "rocket_name": "Falcon 1",
        "rocket_type": "Merlin A",
        "first_stage": {
            "cores": [{
                "core_serial": "Merlin1A",
                "flight": 1,
                "block": null,
                "gridfins": false,
                "legs": false,
                "reused": false,
                "land_success": null,
                "landing_intent": false,
                "landing_type": null,
                "landing_vehicle": null
            }]
        },
        "second_stage": {
            "block": 1,
            "payloads": [{
                "payload_id": "FalconSAT-2",
                "norad_id": [],
                "reused": false,
                "customers": ["DARPA"],
                "nationality": "United States",
                "manufacturer": "SSTL",
                "payload_type": "Satellite",
                "payload_mass_kg": 20,
                "payload_mass_lbs": 43,
                "orbit": "LEO",
                "orbit_params": {
                    "reference_system": "geocentric",
                    "regime": "low-earth",
                    "longitude": null,
                    "semi_major_axis_km": null,
                    "eccentricity": null,
                    "periapsis_km": 400,
                    "apoapsis_km": 500,
                    "inclination_deg": 39,
                    "period_min": null,
                    "lifespan_years": null,
                    "epoch": null,
                    "mean_motion": null,
                    "raan": null,
                    "arg_of_pericenter": null,
                    "mean_anomaly": null
                },
                "uid": "UerI6qmZTU2Fx2efDFm3QQ=="
            }]

И получает

Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY в строке 1, столбец 2, путь $

В результате произошел сбой при запуске приложения. Вот мой метод:

val url = "https://api.spacexdata.com/v3/launches"
        val client = OkHttpClient()
        val request = Request.Builder().url(url).build()

        client.newCall(request).enqueue(object : Callback {
            override fun onResponse(call: Call, response: Response) {
                val body = response.body?.string()
                println(body)

                val gson = GsonBuilder().create()

                val spaceXFeed = gson.fromJson(body, SpaceXFeed::class.java)
            }

            override fun onFailure(call: Call, e: IOException) {
                println("Failed to execute request")
            }
        })

    }
}

class SpaceXFeed(val images: List<Images>)

class Images(val id: Int, val name: String)

Любые советы, как избежать этого сбоя и правильно его проанализировать для использования полей?

1 Ответ

1 голос
/ 23 октября 2019

Ваша строка json является массивом объектов, поэтому вам необходимо проанализировать ее с типом списка / массива

val listType = object : TypeToken<List<Your_Object>>() { }.type
val spaceXFeed = gson.fromJson<List<Your_Object>>(body, listType)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...