Не могу обработать список дерева json, используя TypeToken + generics с Gson в Kotlin

У меня есть структура JSON, как показано ниже:

{
  "object": "list",
  "total": 3,
  "data": [
    {
      "object": "brand",
      "id": "15243937043340",
      "company": {
        "object": "company",
        "id": "956936000",
        "name": "ABC"
      },
      "name": "Kindle",
      "images": [
        "http://www.spacecentrestorage.com/assets/uploads/General/SCS-Slide02-Commercial.jpg"
      ]
    },
    {
      "object": "brand",
      "id": "15243937043340",
      "company": {
        "object": "company",
        "id": "956936000",
        "name": "ABC"
      },
      "name": "Kindle",
      "images": [
        "http://www.spacecentrestorage.com/assets/uploads/General/SCS-Slide02-Commercial.jpg"
      ]
    },
    {
     "object": "brand",
      "id": "15243937043340",
      "company": {
        "object": "company",
        "id": "956936000",
        "name": "ABC"
      },
      "name": "Kindle",
      "images": [
        "http://www.spacecentrestorage.com/assets/uploads/General/SCS-Slide02-Commercial.jpg"
      ]
    }
  ],
  "associated": {}
}

И это мое отображение классов данных Gson:

data class Response (

        @SerializedName("object")
        val obj: String,
         val total: Int,
         val data: List<*>,
         val associated: Response
)


data class Brand (

        @SerializedName("object")
        val obj: String,
        val id: String,
         val name: String,
         val images: List<String>,
         val company: Company
)

   data class Company (

        @SerializedName("object")
        val obj: String,
        val id: String,
         val name: String 
)

Когда дело доходит до извлечения дерева, как указано выше, я обнаружил, что возвращаемая строка данных становится Malformed Json и дает MalformedJsonException для $[0].companies.null.

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

  val response = gson.fromJson(queryResult , Response::class.java)
        println("result 2 : $response" )
        val dataString = response.data.toString()
        println("result 3 : $dataString" )
        val brands  = Gson().fromJson(dataString, Array<Brand>::class.java).toMutableList()
        println("result 4 : $brands" )

Я бы хотел спросить:

  1. Если возвращать компонент json в строку, будут ли удалены все отступы и символы?

  2. Чтобы извлечь все связанные объекты из элементов списка объектов, какие меры предосторожности я должен предпринять для десериализации списка объектов с использованием Gson?

1 ответ

Если вы установите параметр типа data список в Response в Brand GSON знает, как десериализовать элементы списка.

data class Response (

    @SerializedName("object")
    val obj: String,
    val total: Int,
    val data: List<Brand>, 
    val associated: Response

)

Используя это, нет необходимости снова анализировать элементы списка, и вы можете получить все brands как это:

val response = Gson().fromJson(queryResult , Response::class.java)
val dataList = response.data
print("brands: " )
dataList.forEach { println(it) }
Другие вопросы по тегам