1
votes

Kotlin comment mapper JSONArray au type (Stream)

J'essaye de mapper mon JSONArray à un Array .

Je le fais comme ceci:

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

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

Mais il n'est pas tapé comme un JSONObject , y a-t-il un moyen de forcer le taper sur JSONObject ?


0 commentaires

3 Réponses :


3
votes

Le problème est que resultData a un type de JSONArray , qui est une classe d'utilitaire JSON qui ne remplace pas Kotlin / Java Array interface et n'a donc pas de fonction map .

Vous devez récupérer chaque chaîne par index et générer un nouveau tableau comme celui-ci:

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


0 commentaires


2
votes

Ce que jackqack a proposé dans son answer est ce que vous devez faire, je veux juste ajouter que puisque vous voulez renvoyer un Array , vous devez également mapper les exceptions sur null. Cela rendra votre code plus robuste. L'argument de type générique peut également être déduit, donc il peut être omis.

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 commentaires