GSON не анализирует вложенный JSON объект в значение - PullRequest
0 голосов
/ 06 мая 2020

Здравствуйте, я использую GSON для анализа объекта маршрута, который содержит следующее JSON:

{
  "mapOverlays": [
    {
      "id": 1,
      "route": 73,
      "url": "https://en.wikiarquitectura.com/wp-content/uploads//2017/01/White_House_distr_2C2BA.png",
      "lat": 0.00,
      "lng": 0.00,
      "width": 2000,
      "height": 1335,
      "scale": 1,
      "constraints": {
        "w": [
          0.00,
          0.00
        ],
        "x": [
          0.00,
          0.00
        ],
        "y": [
          0.00,
          0.00
        ]
      },
      "flags": ""
    }
  ]
}

Проблема в том, когда я пытаюсь получить доступ к JsonObject с ограничениями , Я получаю пустой объект JSONObject.

Вот класс модели данных базовых карт.

import com.google.gson.JsonObject
import com.travelstorysgps.travelstoryssdk.extensions.md5
import java.io.Serializable

class Basemap (

    val id: Int,
    val route: Int,
    val url: String,
    val lat: Double,
    val lng: Double,
    val width: Int,
    val height: Int,
    val scale: Double,
    val constraints : JsonObject ,
    val flags: String
) : Serializable {
    val filename: String
        get() = url.md5() + ".file"

}

И это результат, который я получаю, когда вызываю Basemap.constraints: I/System.out: [BASEMAP]: {} Он должен содержат массивы JSONArrays с именами w, x и y.

Что-то не так с моим классом модели данных?

EDIT: Вот родительский объект Route:

package com.travelstorysgps.travelstoryssdk.data.model

import android.content.Context
import com.travelstorysgps.travelstoryssdk.data.Location
import java.io.Serializable
import java.util.*
import kotlin.math.floor

data class Route(
    val route: RouteDefinition,
    val tracks: List<Track>,
    val geotags: List<Geotag>,
    val images: List<Image>,
    val music: List<Music>,
    val assets: AssetList,
    val orgs: List<Organization>,
    val mapOverlays: List<Basemap>,
    val ecoupons: List<Coupon>,
    var distance: Int,
    var routeKey: String = "",
    var isDownloading: Boolean = false
) : Serializable {
    val artists: List<Int>
        get() = music.map { it.artist }.distinct()

}```

1 Ответ

0 голосов
/ 06 мая 2020

Объект Basemap заключен в родительский объект JSON в поле массива mapOverlays. Вам нужен дополнительный класс для десериализации в правильной структуре.

data class Parent(val mapOverlays: List<Basemap>)

fun someFn(json: String) {

  val parent = Gson().fromJson(json, Parent::class.java)
  println(parent.mapOverlays[0].constraints)
}
...