因此,我对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
。
-如何正确解析数据类
顺便说一句,在使用此数据类之前,当我仍在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"
}
]
]
}
答案 0 :(得分:0)
回答您的第一个问题,反编译的类是怎么变成这样的,它称为type erasure。
不过,是第二个问题。我没有设法重现错误。
您没有指定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]
可以正常工作。