Как преобразовать JsonObject в модель класса kotlin android - PullRequest
0 голосов
/ 14 января 2020

Я получаю некоторые данные с сервера и преобразую их в JsonArray. Я думал, что, возможно, я смогу преобразовать этот массив в обычный массив объектов класса, но мне не удалось это сделать. Я пытался сделать это так:

val testArray = tpsObject.getAsJsonObject("questions")[tpsSelection[0].toString()].asJsonArray
  for (i in 0 until testArray.size()) {
Log.i("m",Gson().fromJson(testArray.get(i).asJsonObject.toString(),QuestionModel::class.java).question.toString())
   }

, но я получил ошибку:

 com.google.gson.JsonSyntaxException: Expected a com.google.gson.JsonObject but was com.google.gson.JsonArray

С другой стороны, я могу показать все элементы JsonArray следующим образом: l oop:

Log.i("m",testArray.get(i).asJsonObject.toString())

Я также пытался сделать это так:

val jsonParser = JsonParser.parseString(testArray.get(i).asJsonObject.toString())
val model: QuestionModel = Gson().fromJson(jsonParser, QuestionModel::class.java)

, но я получаю похожую ошибку. Так может кто знает, как решить эту проблему?

ОБНОВЛЕНИЕ

my json:
"1": [
    {
        "answer_options": [
            {
                "id": 216,
                "answer": "some text"
            },
            {
                "id": 217,
                "answer": "some text"
            },
            {
                "id": 218,
                "answer": "some text"
            },
            {
                "id": 219,
                "answer": "some text"
            },
            {
                "id": 220,
                "answer": "some text"
            }
        ],
        "id": 949,
        "question": "some text"
    },
               ...
               {
        "answer_options": [
            {
                "id": 216,
                "answer": "some text"
            },
            {
                "id": 217,
                "answer": "some text"
            },
            {
                "id": 218,
                "answer": "some text"
            },
            {
                "id": 219,
                "answer": "some text"
            },
            {
                "id": 220,
                "answer": "some text"
            }
        ],
        "id": 949,
        "question": "some text"
    },
],

мой класс модели:

class QuestionModel {
    @SerializedName("question")
    @Expose
    var question: String? = null

    @SerializedName("id")
    @Expose
    var id: Int? = null

    @SerializedName("answer_options")
    @Expose
    var answer_options: JsonObject? = null
}

возможно, это поможет найти решение

1 Ответ

2 голосов
/ 14 января 2020

Я бы посоветовал вам использовать kotlinx.serialization вместо этого, но в интересах не быть стереотипным пользователем StackOverflow, который говорит: «А не так, делайте Б», я тоже постараюсь исправить вашу проблему .

Вам действительно нужно опубликовать свой JSON (или его фрагмент) и определение класса, так как в противном случае вам очень трудно помочь. Основная проблема заключается в том, что вы передаете Gson массив, но он хотел объект. Возможно, вы на самом деле используете 2d массив в JSON? Это было бы намного проще отладить с учетом трассировки стека.

Кроме того, вы, похоже, вызываете .toString () для JsonObject до того, как вы его десериализовали, что подразумевает, что вы выполняете повторную сериализацию в Json и затем снова ... но почему?

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