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

Posted

技术标签:

【中文标题】使用 Moshi/Retrofit2 访问深度嵌套的 JSON 数组【英文标题】:Accessing deeply nested JSON array with Moshi/Retrofit2 【发布时间】:2019-03-04 00:47:58 【问题描述】:

我只需要“照片”数组。我的 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 中返回一个“照片”并获取画廊项目。没有崩溃,但解析不正确。我得到“照片”对象,但“照片”为空。

关于如何访问我需要的数据有什么想法吗?

【问题讨论】:

问题可能是 Json(name) 注释没有应用于该字段。您是否在 Moshi 中使用 Kotlin 支持(请参阅自述文件)? 【参考方案1】:

不幸的是,@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
)

【讨论】:

不错!感谢您的信息!【参考方案2】:

试试这个!

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/

【讨论】:

谢谢,这让我更接近了。响应具有正确的 pagepagesphotosList 仍然为空。 你能试试这个数据类 Photos(@Json(name = "page") val page: Int, @Json(name = "pages") val pages: String, @Json(name = "照片") val photosList: List = ArrayList() )

以上是关于使用 Moshi/Retrofit2 访问深度嵌套的 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

Rails 使用 JSON 将深度嵌套属性到 Vue 实例

如何使用 SwiftyJSON 从深度嵌套的 JSON 字典中获取字符串 [重复]

使用 Python 访问 HTML <script> 标记内的深层嵌套数据

React:使用 Hooks 为深度嵌套对象设置状态

在 Golang 中访问 map[string]interface 类型的嵌套映射

在没有 NoneType 错误的情况下访问嵌套字典的 pythonic 方法是啥