Как разобрать ниже данные Json в Котлине?

Мне нужно разобрать эту информацию-

[
{
    "artist": "12",
    "image": "23"
},
{
    "video_id": "12",
    "video_title": "23"
},
{
    "video_id": "12",
    "video_title": "23"
},
{
    "video_id": "12",
    "video_title": "23"
},
{
    "video_id": "12",
    "video_title": "23"
},
{
    "video_id": "12",
    "video_title": "23"
}]

Как вы можете видеть, первое поле отличается, как по-разному анализировать информацию ниже и первое поле по-разному в Kotlin.

Я разбираю 1-ю часть как-

response ->

                for (i in 0..(response.length() -1)){

                    /**
                        FIRST SONG
                     **/
                    val song = response.get(0).toString()

                    val listOfSongs = response.toString()

                    val parser = Parser()
                    val stringBuilder = StringBuilder(song)
                    val json: JsonObject = parser.parse(stringBuilder) as JsonObject
                    val firstArtist = json.string("artist")
                    val firstImage = json.string("image")
                    val intent = Intent(activity,ResultPage::class.java)
                    intent.putExtra("firstArtist",firstArtist)
                    intent.putExtra("firstImage",firstImage)

                    startActivity(intent)
                    /**
                        FIRST SONG
                    **/


                }
            }

и здесь я также использую библиотеку KLAXON.


person shivam Kapoor    schedule 27.08.2018    source источник


Ответы (2)


Для вашего json это должно работать:

fun parseResponse(response: String) {

    var artist = ""
    var image = ""
    val videoList = ArrayList<Video>()

    val jsonArray = JSONArray(response)

    (0..5).forEach { index ->
        val jsonObject = jsonArray.getJSONObject(index)
        if (jsonObject.has("artist") && jsonObject.has("image")) {
            artist = jsonObject.getString("artist")
            image = jsonObject.getString("image")
        }
        else if (jsonObject.has("video_id") && jsonObject.has("video_title")) {
            val newVideo = Video(jsonObject.getString("video_id"), jsonObject.getString("video_title"))
            videoList.add(newVideo)
        }
    }
}

class Video(val id: String, val title: String)

Но этот путь очень долог и не нужен. Я бы предложил использовать библиотеку сопоставления объектов, например GSON или Моши.

Для этого список видео в вашем json в идеале должен выглядеть примерно так:

[
    {
        "artist": "12",
        "image": "23",
        "videos": [
            {
                "video_id": "12",
                "video_title": "23"
            },
            {
                "video_id": "12",
                "video_title": "23"
            },
            {
                "video_id": "12",
                "video_title": "23"
            },
            {
                "video_id": "12",
                "video_title": "23"
            },
            {
                "video_id": "12",
                "video_title": "23"
            }
        ]
    }
]

Используя этот Json, вы можете легко создать класс для этого объекта, например.

class Artist(val id: String, val name: String, val image: String, val videos: List<Video>)
class Video(@field:Json(name = "video_id") val id: String, @field:Json(name = "video_title") val title: String)

И легко разбирать их следующим образом:

    Moshi.Builder().build().adapter(Artist::class.java).fromJson(response)

а затем получить доступ к этой информации, например:

    val artist = Moshi.Builder().build().adapter(Artist::class.java).fromJson(response)

    intent.putExtra("firstArtist",artist?.name)
    intent.putExtra("firstImage",artist?.image)
person Usama K. Zafar    schedule 27.08.2018
comment
у меня проблемы с использованием запечатанного класса kotlin, я не могу получить значение json - person Subhanshuja; 22.11.2019

Вы можете использовать приведенный ниже код для анализа данного json в kotlin.

  private fun parseJson(jsonResponse: String){
        val jsonArray = JSONArray(jsonResponse)
        for (i in 0..jsonArray!!.length() - 1) {
            val jsonObj = jsonArray.optJSONObject(i)

            val artist =jsonObj.optString("artist")
            val image =jsonObj.optString("image")

            val videosArray = jsonObj.optJSONArray("videos")
            for (i in 0..videosArray!!.length() - 1) {
                val videoObj = jsonArray.optJSONObject(i)
                val video_id =videoObj.optString("video_id")
                val video_title =videoObj.optString("video_title")
            }
        }
    }
person Chetan Joshi    schedule 27.08.2018
comment
Я думаю, что лучше сочетать с моделью класса - person Subhanshuja; 22.11.2019