使用Moshi / Retrofit2访问深度嵌套的JSON数组

时间:2018-09-28 04:23:09

标签: android kotlin retrofit2 moshi

我需要的只是“照片”阵列。我的JSON看起来像这样:

 {
  "photos": {
    "page": 1,
    "pages": "1000",
    "perpage": 1,
    "total": "1000",
    "photo": [
      {
        "id": "44049202615",
        "owner": "159796861@N07",
        "secret": "cb8f476a4d",
        "server": "1958",
        "farm": 2,
        "title": "Murugan",
        "ispublic": 1,
        "isfriend": 0,
        "isfamily": 0
      }
    ]
  },
  "stat": "ok"
}

我是Moshi / Retrofit的新手。我看到了this,但我还不太了解如何进行这项工作。我以为我可以快速而又肮脏地做一些事情来获取所需的值,这样我就可以继续构建我的应用程序(稍后再返回以实现正确的实现)。

我快速又肮脏的想法是这样的:

data class GalleryItem(@Json(name = "title") val caption: String,
                       @Json(name = "id") val id: String,
                       @Json(name = "url_s") val url: String?)

data class Photo(@Json(name = "photo") val galleryItems: List<GalleryItem>)

data class Photos(@Json(name = "photos") val photo: Photo)

我以为我可以从我的api返回“照片”并获取图库项目。没有崩溃,但没有正确解析。我得到“照片”对象,但“照片”为空。

关于如何访问所需数据的任何想法?

2 个答案:

答案 0 :(得分:4)

不幸的是,@Json注释gets ignored in Kotlin classes。解决方法(来自我刚才给出的链接)是改用@field:Json。为您的数据类尝试这样的事情:

data class ResponseData(
    val photos: Photos
)

data class Photos(
    @field:Json(name = "photo") val galleryItems: List<GalleryItem>
)

data class GalleryItem(
    val id: String,
    val title: String
)

答案 1 :(得分:1)

尝试这个!

data class Response(
            @Json(name = "photos")
            val photos: Photos,

            @Json(name = "stat")
            val stat: String
    )


    data class Photos(
            @Json(name = "page")
            val page: Int,

            @Json(name = "pages")
            val pages: String,

            @Json(name = "photo")
            val photosList: List<Photo>
    )

    data class Photo(
            val id: String,
            val owner: String
    )

现在您可以使用

访问照片列表
response.photos.photosList

您可以使用此工具轻松地从json创建pojo。访问此站点。 http://www.jsonschema2pojo.org/