将JSONArray转换为Iterable<JSONObject> - Kotlin

4
我正在Kotlin中使用Json-Simple
在什么情况下会进行这种转换:
val jsonObjectIterable = jsonArray as Iterable<JSONObject>

成为危险的对象?jsonArray是一个JSONArray对象。
2个回答

4
你可以成功地进行类型转换,因为 JSONArray Iterable。但它不能确保 JSONArray 中的每个元素都是 JSONObjectJSONArray 是一个 原始类型 List,这意味着它可以添加任何东西,例如:
val jsonArray = JSONArray()
jsonArray.add("string")
jsonArray.add(JSONArray())

当代码对从原始类型JSONArray向下转换的泛型类型Iterable<JSONObject>进行操作时,可能会抛出ClassCastException异常,例如:
val jsonObjectIterable = jsonArray as Iterable<JSONObject>

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

所以这就是为什么它变得危险。另一方面,如果您只想将 JSONObjec 添加到 JSONArray 中,您可以将 原始类型 JSONArray 强制转换为泛型类型 MutableList<JSONObject>,例如:
@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"

我明白了。这个jsonArray是我信任的API的响应(应该返回一个底层JSON对象的JSONArray)。因此,我可以认为这是完全安全的,对吗? - pavlos163
@pk1914 不是的,JSON 数据类型不仅仅有 JSONObjectJSONArray,还包括 stringbooleannumber。另外,一个 JSONArray 也可以添加任何类型的 Object,例如:添加另一个 JSON 数组 add(JSONArray()) - holi-java

1
以下是一个相当简单的实现。
假设你的对象是人(Person)
data class Person( val ID: Int, val name: String): Serializable
val gson = Gson()
val persons: Array<Person> = gson.fromJson(responseSTRING, Array<Person>::class.java)

现在,persons是一个Person数组

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接