【问题标题】:Can't handle json tree list using TypeToken + generics with Gson in Kotlin无法在 Kotlin 中使用带有 Gson 的 TypeToken + 泛型处理 json 树列表
【发布时间】:2018-07-29 03:39:18
【问题描述】:

我得到的json结构如下:

{
  "object": "list",
  "total": 3,
  "data": [
    {
      "object": "brand",
      "id": "15243937043340",
      "company": {
        "object": "company",
        "id": "956936000",
        "name": "ABC"
      },
      "name": "Kindle",
      "images": [
        "http://www.spacecentrestorage.com/assets/uploads/General/SCS-Slide02-Commercial.jpg"
      ]
    },
    {
      "object": "brand",
      "id": "15243937043340",
      "company": {
        "object": "company",
        "id": "956936000",
        "name": "ABC"
      },
      "name": "Kindle",
      "images": [
        "http://www.spacecentrestorage.com/assets/uploads/General/SCS-Slide02-Commercial.jpg"
      ]
    },
    {
     "object": "brand",
      "id": "15243937043340",
      "company": {
        "object": "company",
        "id": "956936000",
        "name": "ABC"
      },
      "name": "Kindle",
      "images": [
        "http://www.spacecentrestorage.com/assets/uploads/General/SCS-Slide02-Commercial.jpg"
      ]
    }
  ],
  "associated": {}
}

这是我的 Gson 数据类映射:

data class Response (

        @SerializedName("object")
        val obj: String,
         val total: Int,
         val data: List<*>,
         val associated: Response
)


data class Brand (

        @SerializedName("object")
        val obj: String,
        val id: String,
         val name: String,
         val images: List<String>,
         val company: Company
)

   data class Company (

        @SerializedName("object")
        val obj: String,
        val id: String,
         val name: String 
)

在上面提取树时,我发现返回的数据字符串变成 Malformed Json 并在 $[0].companies.null 上给出 MalformedJsonException

我已阅读有关 recursive deserialisation function 的信息,但它不适用于我的情况。我采用如下反序列化方法,使用原始方法,它会导致错误

  val response = gson.fromJson(queryResult , Response::class.java)
        println("result 2 : $response" )
        val dataString = response.data.toString()
        println("result 3 : $dataString" )
        val brands  = Gson().fromJson(dataString, Array<Brand>::class.java).toMutableList()
        println("result 4 : $brands" )

我想问一下:

  1. 如果将json组件返回到字符串,是否所有的缩进和符号“都被删除?

  2. 要提取对象列表元素的所有关联对象,使用 Gson 反序列化对象列表需要采取哪些预防措施?

【问题讨论】:

  • 做到了。你得到了一个可行的解决方案

标签: json kotlin android gson


【解决方案1】:

如果将Responsedata列表的类型参数设置为Brand,GSON就知道如何反序列化列表中的项目了。

data class Response (

    @SerializedName("object")
    val obj: String,
    val total: Int,
    val data: List<Brand>, 
    val associated: Response

)

使用这个不需要再次解析列表中的项目,你可以像这样得到所有brands

val response = Gson().fromJson(queryResult , Response::class.java)
val dataList = response.data
print("brands: " )
dataList.forEach { println(it) }

【讨论】:

  • 我明确的告诉你,响应数据可以是每一个数据类而不是品牌
  • 所以列表中的每一项都可以有不同的类型?还是每个列表都可以有不同的泛型类型,但列表中的项目对于给定列表具有相同的类型?
  • 属性 Data 可以是泛型对象列表或泛型对象。对象可以是我可以定义的每一个数据类。我正在寻找使用由基础数据对象扩展的自定义数据类的方法。你有什么线索吗?好的
猜你喜欢
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多