【问题标题】:Kotlin: get List object from JSON stringKotlin:从 JSON 字符串中获取 List 对象
【发布时间】:2020-09-22 15:50:41
【问题描述】:

第一次探索kotin的可能性,有点困惑如何将JSON字符串转换为List对象。

data.json 很简单

{
  "0" : "some picture",
  "1" : "other picture"
}

尝试像这样转换:

        val inputStream: InputStream = context?.assets?.open("data.json") ?: return null
    val size: Int = inputStream.available()
    val buffer = ByteArray(size)
    inputStream.read(buffer)
    val jsonString = String(buffer)

    println(jsonString)

    val gson = Gson()
    
    // THIS LINE CALLS ERROR
    val list: List<String> = gson.fromJson(jsonString, Array<String>::class.java).asList()

    list.forEachIndexed {index, item -> Log.i("item", "$index::$item")}

结果出现错误

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

如何解决这个问题或如何从 json 字符串中正确检索列表对象?

【问题讨论】:

  • 错误告诉你你需要知道什么。您告诉 Gson 期望一个数组(如果包含在 [ ] 中,将是一个数组),但您的字符串是一个对象(包含在 { } 中)

标签: android json kotlin


【解决方案1】:

而不是使用列表

val list: List<String> = gson.fromJson(jsonString, Array<String>::class.java).asList()

使用地图(这会将您的 json 数据解析为地图)

val map = gson.fromJson<Map<String, String>>(jsonString, MutableMap::class.java)

【讨论】:

    【解决方案2】:

    这个 JSON 不是数组。您必须使对象成为这种类型。它看起来像这样:

    import com.google.gson.annotations.SerializedName
    
    data class JsonData(
        @SerializedName("0")
        val x0: String,
        @SerializedName("1")
        val x1: String
    )
    

    现在在您的活动中您可以将 json 转换为对象:

    import android.os.Bundle
    import androidx.appcompat.app.AppCompatActivity
    import com.google.gson.Gson
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            val gson = Gson()
    
            val json =
                """
                {
                    "0" : "some picture",
                    "1" : "other picture"
                }
                """
    
            val jsonData = gson.fromJson<JsonData>(json, JsonData::class.java)
    
            println(jsonData.x0) // some picture
            println(jsonData.x1) // other picture
        }
    }
    

    现在您可以对该对象进行操作,但如果您想要字符串列表,您可以这样做:

    val list = arrayListOf<String>(jsonData.x0, jsonData.x1)
    println(list) //  [some picture, other picture]
    

    【讨论】:

    • 如果他有更多的json数据,比如"2": "Some more data", "2": "Some more data2"
    • 那么它不会工作,但我认为 JSON 只包含这两个值。但如果它真的有很多值,这个 JSON 应该只是一个字符串数组
    • 感谢您的回复。可能有两个以上的值,这只是一个示例。
    • 哦,好吧,所以使用@akhilesh0707 答案,它应该可以正常工作。但是如果它是你的 JSON 并且每个第一个值只是一个索引,我认为你应该制作一个这样的数组:[ "some picture", "other picture" ]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多