Kotlin如何将JSONArray映射到Type(流)

时间:2019-01-10 20:17:55

标签: kotlin functional-programming stream

我正在尝试将我的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 :(得分:2)

问题是resultData的类型为JSONArray,这是JSON实用程序类,不会覆盖Kotlin / Java Array接口,因此没有{ {1}}功能。

您必须按索引检索每个字符串并生成新的数组,如下所示:

map

答案 1 :(得分:1)

jackqack在他的answer中提出的建议是您应该做的,我只是想补充一点,因为您要返回一个Array<String?>,所以还应该将异常映射为null。这将使您的代码更健壮。泛型类型参数也可以被推断,因此可以省略。

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

答案 2 :(得分:0)

问题是您的resutData没有map函数!参见https://developer.android.com/reference/org/json/JSONArray

相反,您可以做的是遍历JSONArray并将每个条目添加到新Array中,如下所示:

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