Kotlin中的2维列表强制转换为com.google.gson.internal.LinkedTreeMap

时间:2019-06-22 00:20:24

标签: java android kotlin gson

因此,我对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"
        }
    ]
]
}

1 个答案:

答案 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]可以正常工作。