Transformando JSONArray en Iterable <JSONObject> – Kotlin

Estoy usando Json-Simple en Kotlin.

En qué situaciones podría esto arrojar:

val jsonObjectIterable = jsonArray as Iterable<JSONObject> 

Ser peligroso? jsonArray es un object JSONArray .

Puedes lanzarlo con éxito, ya que JSONArray es-A Iterable . pero no puede asegurar que cada elemento en JSONArray sea ​​un JSONObject .

El JSONArray es una List tipo sin formatting , lo que significa que puede agregar cualquier cosa, por ejemplo:

 val jsonArray = JSONArray() jsonArray.add("string") jsonArray.add(JSONArray()) 

Cuando el código opera en un tipo genérico Iterable<JSONObject> desde un tipo crudo JSONArray , puede lanzarse una ClassCastException , por ejemplo:

 val jsonObjectIterable = jsonArray as Iterable<JSONObject> // v--- throw ClassCastException, when try to cast a `String` to a `JSONObject` val first = jsonObjectIterable.iterator().next() 

Entonces, es por eso que se vuelven peligrosos. Por otro lado, si solo desea agregar JSONObjec s al JSONArray , puede convertir un tipo sin formatting JSONArray en un tipo genérico MutableList<JSONObject> , por ejemplo:

 @Suppress("UNCHECKED_CAST") val jsonArray = JSONArray() as MutableList<JSONObject> // v--- the jsonArray only can add a JSONObject now jsonArray.add(JSONObject(mapOf("foo" to "bar"))) // v--- there is no need down-casting here, since it is a Iterable<JSONObject> val jsonObjectIterable:Iterable<JSONObject> = jsonArray val first = jsonObjectIterable.iterator().next() println(first["foo"]) // ^--- return "bar" 
  • Kotlin: forma idiomática de llamar (Int, Int) -> Int con un par <Int, Int>?
  • ¿Diferencia entre abrir y anular methods en Kotlin?
  • Propiedad de Kotlin observable
  • ¿Cómo iterar sobre Single <List> y asignar a otra list?
  • Manera idiomática de manejar lists anulables o vacías en Kotlin
  • Formas dinámicas de Android
  • No puedo get una variable en la sección de buildscript
  • Problema de tipo genérico Kotlin
  • Kotlin mutableList () devuelto desde Map :: getOrElse no expone add ()
  • RxJava2 + Retrofit pantalla negra en request de datos
  • Kotlin: No se pueden aplicar dos condicionales a la vez. Verificar con el estilo de function de "cuerpo de retorno".