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 ?
3 Réponses :
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) }
}
Le problème est que votre Ce que vous pouvez faire à la place, c'est parcourir le JSONArray et ajouter chaque entrée à votre nouveau Array, comme ceci: resutData n'a pas de fonction map ! Voir https://developer.android.com/reference/org/json/JSONArray a>. 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))
}
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
}
}
}