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