首页 > 解决方案 > 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"
        }
    ]
]
}

标签: javaandroidkotlingson

解决方案


回答你的第一个问题,反编译的类是怎么变成这样的,叫做类型擦除

不过,对于你的第二个问题。我没有设法重现错误。
您没有指定您的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]预期工作。


推荐阅读