因此,在处理响应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
答案 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:
感谢您的答复。
答案 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)
}