改造-Android-使用gson处理多种类型的键和值

时间:2018-12-09 05:49:10

标签: android json gson retrofit retrofit2

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

让我向您展示json响应:

import pandas as pd
from sklearn.model_selection import train_test_split

category=pd.read_csv('dataset.tsv',delimiter='\t',encoding='utf-8')

train, test = train_test_split(category, test_size=0.2)

test.to_csv('checkme.txt')

这是pojo类的表示形式:

{
   "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
   }
}

我知道当前结构无法表示json格式。但是我的想法已经用完了。

btw堆栈错误是这样说的:

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
)

编辑:添加更多上下文

我正在使用Gsonconverter进行改造。

Expected BEGIN_OBJECT but was NUMBER

5 个答案:

答案 0 :(得分:0)

您的问题在这里:

"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
)

答案 1 :(得分:0)

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

答案 2 :(得分: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;

希望能为您提供帮助。

答案 3 :(得分:0)

已经有一段时间了,但我仍然可以得出我需要的结论。

data class OHLCResponse(
private val error: List<String>,
val result: LinkedTreeMap<String, Any>)

结果发现,在LinkedTreeMap类上,我只需要将第二个类类型参数传递为Any,并且可以将其转换为所需的任何内容。

我还在这里留下了一个很好的工具,可以帮助您将json响应映射到kotlin普通对象/ DTO:

https://app.quicktype.io/

感谢您的答复。

答案 4 :(得分:0)

我通过适配器类中的此类解决方案解决了该问题。

override fun getItemCount(): Int = leagueTableList[0].size

override fun onBindViewHolder(holder: LeagueTableViewHolder, position: Int) {
    val gs = Gson()
    val js = gs.toJson(leagueTableList[0][position])
    val standing = gs.fromJson(js, Standing::class.java)
    holder.view.table = standing
    holder.bind(standing,onItemClick)
}