首页 > 解决方案 > Retrofit - Android - 使用 gson 处理多种类型的键和值

问题描述

因此,在处理来自响应 json 的键和值的多种类型时,我想从我的应用程序中使用的 api 遇到了一些问题。

让我向您展示 json 响应:

{
   "error":[

   ],
   "result":{
      "field1":[
         [
            1544258160,
            "57.15",
            "57.15",
            "57.15",
            "57.15",
            "0.00",
            "0.00000000",
            0
         ],
         [
            1544258220,
            "56.89",
            "56.89",
            "56.89",
            "56.89",
            "56.89",
            "2.94406281",
            1
         ]
      ],
      "field2":1544301240
   }
}

这是 pojo 类的表示:

data class Response(val error: List<String>, val result: LinkedTreeMap<String, List<List<Result>>>)

data class Result(
    val time: Double,
    val open: String,
    val high: String,
    val low: String,
    val close: String,
    val vwap: String,
    val volume: String,
    val count: Double
)

我知道当前的结构无法代表 json 格式。但我已经没有想法了。

顺便说一句,堆栈错误是这样说的:

Expected BEGIN_OBJECT but was NUMBER

编辑:添加更多上下文

我将 Gsonconverter 用于改造构建器。

val retrofit = Retrofit.Builder().baseUrl(API_URL).client(client)
            .addConverterFactory(GsonConverterFactory.create()).build()

标签: androidjsongsonretrofitretrofit2

解决方案


你的问题在这里:

"field2":1544301240

您定义如下:

val result: LinkedTreeMap<String, List<List<Result>>>

但你得到的不是那个数字!!!

编辑

试试这个:

data class Response(val error: List<String>, val result: YourModel)

data class YourModel(val field1: LinkedTreeMap<String, List<List<Result>>>, val field2: Double)

data class Result(
    val time: Double,
    val open: String,
    val high: String,
    val low: String,
    val close: String,
    val vwap: String,
    val volume: String,
    val count: Double
)

推荐阅读