java - kotlin 中的二维列表转换为 com.google.gson.internal.LinkedTreeMap

标签 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>>
)

但是当我尝试解析历史记录并访问第二个列表时,例如历史记录[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 中使用它时,它运行良好。访问 history[0][0] 返回了 History 的实例

更新 我忘了包含我正在解析的 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"
        }
    ]
]
}

最佳答案

回答你的第一个问题,反编译后的类怎么变成这样了,叫做type erasure .

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

关于java - kotlin 中的二维列表转换为 com.google.gson.internal.LinkedTreeMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56711678/

相关文章:

java - 从另一个类获取数据时出错

android - 如何在 Android 调试版本中禁用断言

android - Maven Android 仪器测试输出

java - ECDSA 使用 HSM 签名并在 Java/Kotlin 中验证

kotlin - 基于 Kotlin 中的按钮单击设置 textview 可见性

java - 从 MySQL 主动更新 Java 的方法

java - 从 JavaFX 选项卡内的字段获取数据

java - 从 Java 访问 Kotlin 枚举

java - 从文件导入证书时 SSL 握手失败

java - 无法正确返回 arraylist 对象