Список 2 измерений в kotlin приведен к com.google.gson.internal.LinkedTreeMap - PullRequest
0 голосов
/ 22 июня 2019

Итак, я новичок в 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] вернул экземпляр History

UPDATE Я забыл включить разбор json. Спасибо, что указали на это Алексею Сошину.

{
    "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 голосов
/ 22 июня 2019

Отвечая на ваш первый вопрос, как декомпилированный класс стал таким, он называется 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] работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...