【发布时间】:2017-07-24 13:04:46
【问题描述】:
我在 Kotlin 中使用 Json-Simple。
在什么情况下可以施放:
val jsonObjectIterable = jsonArray as Iterable<JSONObject>
变得危险? jsonArray 是一个 JSONArray 对象。
【问题讨论】:
标签: json kotlin json-simple
我在 Kotlin 中使用 Json-Simple。
在什么情况下可以施放:
val jsonObjectIterable = jsonArray as Iterable<JSONObject>
变得危险? jsonArray 是一个 JSONArray 对象。
【问题讨论】:
标签: json kotlin json-simple
你可以成功施放它,因为JSONArray is-A Iterable。但它不能确保JSONArray 中的每个元素都是JSONObject。
JSONArray 是一个raw type 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()
所以这就是变得危险的原因。另一方面,如果您只想将JSONObjecs 添加到JSONArray 中,您可以将raw type 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"
【讨论】:
JSONObject&JSONArray,还有string,boolean,number。而JSONArray也可以添加任何类型的Object,例如:添加另一个json数组add(JSONArray())。
以下是一个相当简单的实现。
假设你的对象是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)
现在 people 是 Person
的 Array【讨论】: