【问题标题】:Casting JSONArray to Iterable<JSONObject> - Kotlin将 JSONArray 转换为 Iterable<JSONObject> - Kotlin
【发布时间】:2017-07-24 13:04:46
【问题描述】:

我在 Kotlin 中使用 Json-Simple

在什么情况下可以施放:

val jsonObjectIterable = jsonArray as Iterable<JSONObject>

变得危险? jsonArray 是一个 JSONArray 对象。

【问题讨论】:

    标签: json kotlin json-simple


    【解决方案1】:

    你可以成功施放它,因为JSONArray is-A Iterable。但它不能确保JSONArray 中的每个元素都是JSONObject

    JSONArray 是一个raw type List,这意味着它可以添加任何东西,例如:

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

    当代码从原始类型JSONArray 对向下转换的泛型类型Iterable&lt;JSONObject&gt; 进行操作时,可能会抛出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&lt;JSONObject&gt;,例如:

    @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 的响应(并且应该返回底层 JSONObjects 的 JSONArray)。因此我可以认为这是完全安全的,对吧?
    • @pk1914 不,json数据类型不仅有JSONObject&JSONArray,还有string,boolean,number。而JSONArray也可以添加任何类型的Object,例如:添加另一个json数组add(JSONArray())
    【解决方案2】:

    以下是一个相当简单的实现。

    假设你的对象是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

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 2019-08-17
      • 2011-11-03
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多