将JSONArray转换为Iterable <jsonobject> - Kotlin

时间:2017-07-24 13:04:46

标签: json kotlin json-simple

我在Kotlin中使用Json-Simple

在什么情况下可以演员:

val jsonObjectIterable = jsonArray as Iterable<JSONObject>

变得危险吗? jsonArrayJSONArray个对象。

2 个答案:

答案 0 :(得分:3)

您可以成功投放,因为JSONArray 是-A Iterable。但它无法确保JSONArray中的每个元素都是JSONObject

JSONArrayraw type List,这意味着它可以添加任何内容,例如:

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

当代码对来自原始类型Iterable<JSONObject>的下载通用类型JSONArray进行操作时,可能会抛出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,则可以将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"

答案 1 :(得分:1)

以下是一个简单的实现。

假设您的对象是

data class Person( val ID: Int, val name: String): Serializable
val gson = Gson()
val persons: Array<Person> = gson.fromJson(responseSTRING, Array<Person>::class.java)

现在,人员是

数组