首页 文章

Retrofit - Android - 使用gson处理多个类型的键和值

提问于
浏览
0

因此,当我从应用程序处理多个类型的响应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()

3 回答

  • 0

    是的,是什么让错误是你的响应字段(结果),它是不同的类型 . 但是你只需使用第一种类型 Response(val error: List<String>, val result:LinkedTreeMap<String, List<List<Result>>> 接收所有的json .

    在我看来,你可以用以下方法来解决它 .

    首先,重新定义你接收模型,也许你可以使用Gson JsonObject并在处理值时记住检查类型 .

    其次,与你的后台服务器工程师讨论,同意每种类型的响应 . 可能是“field2”可以是“field2:[[]]”

    接下来,更改您的模型 . 可以在下面定义它

    @Serialized("field1")
    LinkedTreeMap<String, List<List<Result>>> field;
    @Serialized("field2")
    String fields;
    

    希望能帮到你 .

  • 0

    你可以为filed1,filed2类型构建一个Gson JsonDeserializer .
    它是更手动编写的代码,但这样您可以检查字段的类型并调用正确的反序列化器 .

  • 0

    你的问题在这里:

    "field2":1544301240
    

    你定义如下:

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

    但不是那样你得到数字!

    EDIT

    试试这个:

    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
    )
    

相关问题