java - kotlin 中的二维列表转换为 com.google.gson.internal.LinkedTreeMap
问题描述
所以我是 kotlin 的新手,刚刚将我的代码从 java 迁移到 kotlin。我有一个数据类 HistoryList 用于解析来自 API 的响应。
data class HistoryList(
@SerializedName("code")
@Expose
var code: String = "",
@SerializedName("historyByDate")
@Expose
var histories : List<List<History>>
)
但是当我尝试解析历史并访问第二个列表时histories[0][0]
。回报被投射到com.google.gson.internal.LinkedTreeMap
. 我试图调查数据类并尝试将其反编译为 java 这就是我得到的。
public final class HistoryList {
@SerializedName("code")
@Expose
@NotNull
private String code;
@SerializedName("historyByDate")
@Expose
@NotNull
private List histories;
}
正如你注意到反编译代码中的历史变成了一个列表,我猜它应该是
List<List<Histories>> histories;
谁能向我解释一下: -
反编译的类是如何变成这样的
-
为什么会histories[0][0]
被强制转换为com.google.gson.internal.LinkedTreeMap
. - 如何在使用此数据类之前正确解析数据类
BTW,当我仍在 Java 中使用它时,它运行良好。访问histories[0][0]
返回了一个历史实例
更新 我忘了包括我正在解析的 json。感谢您指出 Alexey Soshin。
{
"code": "success",
"historyByDate": [
[
{
"charge": 73728,
"action": "DATA"
},
{
"charge": 105472,
"action": "DATA"
},
{
"charge": 14336,
"action": "DATA"
},
{
"charge": 101376,
"action": "DATA"
},
{
"charge": 0,
"action": "DATA"
},
{
"charge": 15360,
"action": "DATA"
},
{
"charge": 18432,
"action": "DATA"
},
{
"charge": 1060864,
"action": "DATA"
},
{
"charge": 700416,
"action": "DATA"
},
{
"charge": 7168,
"action": "DATA"
},
{
"charge": 0,
"action": "DATA"
}
],
[
{
"charge": 0,
"action": "DATA"
},
{
"charge": 0,
"action": "DATA"
}
],
[
{
"charge": 0,
"action": "DATA"
},
{
"charge": 0,
"action": "DATA"
}
]
]
}
解决方案
回答你的第一个问题,反编译的类是怎么变成这样的,叫做类型擦除。
不过,对于你的第二个问题。我没有设法重现错误。
您没有指定您的History
课程是什么样的,所以我只是使用了:
data class History(val a: String, val b: Int)
而且你也没有具体说明你是如何解析 JSON 的,所以这就是我所做的:
val list = HistoryList("myHistoryList",
listOf(
listOf(History("a", 1), History("b", 2)),
listOf(History("c", 3), History("d", 4), History("e", 5))
))
val gson = Gson()
val historyAsJson = gson.toJson(list)
println(historyAsJson)
// Results in {"code":"myHistoryList","historyByDate":[[{"a":"a","b":1},{"a":"b","b":2}],[{"a":"c","b":3},{"a":"d","b":4},{"a":"e","b":5}]]}
val historyAsObject = gson.fromJson(historyAsJson, HistoryList::class.java)
// Making sure that it's indeed History object
val h: History = historyAsObject.histories[0][0]
println(h)
如您所见,我gson.fromJson(historyAsJson, HistoryList::class.java)
用于转换,并按historyAsObject.histories[0][0]
预期工作。
推荐阅读
- javascript - WebRTC 获取 IP 不一致
- javascript - 等待 `insertAdjacentElement` 更新 DOM
- r - 在 r 中进一步设置子集值
- php - PHP 向上取整值
- python - 如何在 Django REST Framework 中验证完整的模型数据
- javascript - 如何将 reactjs 中的常量和 useEffect 从函数更改为渲染组件
- c++ - 如何在 msbuild vcxproj 中禁用 DYNAMICBASE
- angular - Angular 路由器总是返回主页
- javascript - Firebase:发送 OTP 但禁用使用电话号码登录
- python - seaborn 子图中每一行的颜色条