Kotlin, как сопоставить JSONArray с типом (поток) - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь сопоставить мои JSONArray с Array<String?>.

Я делаю это так:

fun getTextResponse(responseJson: JSONObject): Array<String?>{
        val resultData = responseJson.getJSONArray("data")
                .getJSONObject(0)
                .getJSONArray("result")

        return resultData.map{ it.getString("label") }.toTypedArray()
}

Но it не печатается как JSONObject, есть ли способ заставить его набрать JSONObject?

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Проблема в том, что ваш resutData не имеет функции map! Смотри https://developer.android.com/reference/org/json/JSONArray.

Вместо этого вы можете перебирать JSONArray и добавлять каждую запись в ваш новый массив, например:

fun getTextResponse(responseJson: JSONObject): Array<String?>{
    val resultData = responseJson.getJSONArray("data")
            .getJSONObject(0)
            .getJSONArray("result")

    val arrayList = ArrayList<String>()
    for (i in 0..resultData.length()) {
        arrayList.add(resultData[i].toString())
    }

    return arrayList.toArray(arrayOfNulls<String>(arrayList.size))
}
0 голосов
/ 11 января 2019

Что Джеккэк , предложенный в его ответе , - это то, что вы должны сделать, я просто хочу добавить, что, поскольку вы хотите вернуть Array<String?>, вы также должны сопоставить исключения с нулем. Это сделает ваш код более надежным. Аргумент универсального типа также может быть выведен, поэтому его можно опустить.

fun getTextResponse(responseJson: JSONObject): Array<String?> {
    val resultData = responseJson.getJSONArray("data")
            .getJSONObject(0)
            .getJSONArray("result")

    return Array(resultData.length()) { i ->

        try {
            resultData.getString(i)
        } catch (e: JSONException){
            null
        }
    }
}
0 голосов
/ 11 января 2019

Проблема в том, что resultData имеет тип JSONArray, который является служебным классом JSON, который не переопределяет интерфейс Kotlin / Java Array и, следовательно, не имеет функции map.

Вы должны извлечь каждую строку по индексу и сгенерировать новый массив следующим образом:

fun getTextResponse(responseJson: JSONObject): Array<String?> {
    val resultData = responseJson.getJSONArray("data")
            .getJSONObject(0)
            .getJSONArray("result")
    return Array<String?>(resultData.length()) { i -> resultData.getString(i) }
}
...