Search code examples
androidjsonkotlinretrofitdata-class

Data class for API response structure?


I am using wikipedia API whose response structure is as

{
"batchcomplete": "",
"continue": {
"gpsoffset": 10,
"continue": "gpsoffset||"
  },
  "query": {
"pages": {
  "27667": {
    "pageid": 27667,
    "ns": 0,
    "title": "Space",
    "index": 1,
    "thumbnail": {
      "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/3D_coordinate_system.svg/200px-3D_coordinate_system.svg.png",
      "width": 200,
      "height": 200
    }
  },
  "28189": {
    "pageid": 28189,
    "ns": 0,
    "title": "Space Shuttle",
    "index": 8,
    "thumbnail": {
      "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/STS120LaunchHiRes-edit1.jpg/128px-STS120LaunchHiRes-edit1.jpg",
      "width": 128,
      "height": 200
    }
  },
  "28758": {
    "pageid": 28758,
    "ns": 0,
    "title": "Spacetime",
    "index": 5,
    "thumbnail": {
      "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/GPB_circling_earth.jpg/200px-GPB_circling_earth.jpg",
      "width": 200,
      "height": 150
    }
  }
}
  }
}

I am confused on how to use the pages object I currently have as

data class APIResult(
@SerializedName("query")
val query: Query
)

data class Query(
@SerializedName("pages")
val pages: Pages
)

data class Pages(
@SerializedName("thumbnail")
val thumbnail: Thumbnail
)

data class Thumbnail(
@SerializedName("source")
val source: String
)

Any suggestions?


Solution

  • The query has a pages map inside

    data class Query(
        @SerializedName("pages")
        val pages: Map<String, Page>
    )
    

    And your Pages should actually be a single page

    data class Page(
        @SerializedName("pageid")...
        @SerializedName("thumbnail")
        val thumbnail: Thumbnail
    )
    

    This is one element on a map:

    "28189": {...}
    

    You can't know each key previously, so it is a map of String, Object but you do know the object type which is a Page

    So after that, you can pages.values() and get a list of pages or anything you can do with a Map.