任务三 创建歌曲数据模型

歌曲列表和播放栏的布局已经完成,接下来创建两个数据类:Song 保存一首歌曲的信息,SongResponse 保存接口返回的请求结果和歌曲列表。

一、任务目标

这一步完成后,你将能够:

  • 读懂歌曲接口返回的 JSON,找出”请求结果”和”歌曲数据”两层信息。
  • 按返回样例创建 Song 和 SongResponse,属性名称、类型与样例一一对应。
  • 对样例中缺失或为空的字段,用可空类型和默认值处理。

二、认识歌曲列表接口

应用通过下面的接口获取歌曲数据。

项目内容
接口名称获取歌曲列表
作用取得全部歌曲,供应用展示和播放
请求方式GET
接口地址https://api.food1.sziit.top/music/list
入参无

请求成功时返回的 JSON 如下(资源地址以 … 示意;数组实际有十几首歌曲,这里只完整展示第一首):

成功返回示例
{
"data": [
{
"id": 1,
"name": "唯一",
"singer": "邓紫棋",
"mvPath": "https://…/weiyi_dengziqi_mv.mp4",
"musicPath": "https://…/weiyi_dengziqi.mp3",
"imagePath": "https://…/weiyi_dengziqi_cover.jpg",
"duration": 253000,
"createTime": "2024-09-17 19:29:41",
"updateTime": "2026-02-03 15:46:12"
},
……
],
"code": 200,
"msg": "成功"
}

请求失败时没有 data,code 不是 200,msg 说明失败原因。例如用 POST 方式请求这个接口:

失败返回示例
{
"error": "",
"code": 400,
"msg": "Request method 'POST' not supported"
}

返回数据分两层:最外层的 code、msg、data 描述这次请求的结果,data 数组的每个元素描述一首歌曲。这两层分别对应本任务要创建的两个类:歌曲对象对应 Song,最外层包装对应 SongResponse。SongResponse 的列表要用到 Song,所以先创建内层的 Song,再创建外层的 SongResponse。

三、创建 Song 数据类

1. 创建模型目录

在 app/src/main/java/com/sziit/musicplayer 下创建 model 包,再创建 Song.kt。

2. 编写 Song.kt

app/src/main/java/com/sziit/musicplayer/model/Song.kt
package com.sziit.musicplayer.model
import java.io.Serializable
data class Song(
val id: Int? = null,
val name: String = "",
val singer: String = "",
val mvPath: String? = null,
val musicPath: String? = null,
val imagePath: String? = null,
val duration: Int = 0,
val createTime: String? = null,
val updateTime: String? = null
) : Serializable

Song 使用 data class 表示一首歌曲。属性名称与样例中歌曲对象的字段一致,类型和可空性结合应用在界面上的用法确定:

字段类型作用可空性说明
idInt?歌曲唯一编号默认 null;播放时按编号查找歌曲,缺少编号时不发起播放
nameString歌曲名称样例中每首歌曲都有名称,用非空字符串
singerString歌手名称样例中每首歌曲都有歌手,用非空字符串
mvPathString?MV 地址不是每首歌都有 MV,字段可能缺失,也可能是空字符串
musicPathString?音频播放地址地址缺失的歌曲无法播放,播放环节会跳过
imagePathString?专辑封面地址封面可能缺失,界面有默认封面兜底
durationInt歌曲时长,单位毫秒样例为整数毫秒,界面显示时换算为”分:秒”;缺失时按 0 处理
createTime、updateTimeString?服务端记录的创建和更新时间样例以”年-月-日 时:分:秒”文本返回,界面暂不展示

判断一首歌曲有没有 MV 时,需要同时检查字段缺失和空字符串两种情况,可使用 isNullOrEmpty() 判断。Serializable 使歌曲对象能够被序列化,用于在 Android 组件之间传递对象。

四、创建接口响应模型

SongResponse 保存接口返回的整体结果:code 是状态码,msg 是提示信息,data 是歌曲列表。请求失败时,data 可能缺失,因此使用可空类型 List<Song>?;code 的默认值为 -1,表示没有有效的状态码。

1. 创建 SongResponse.kt

在同一个 model 包中创建 SongResponse.kt。

app/src/main/java/com/sziit/musicplayer/model/SongResponse.kt
package com.sziit.musicplayer.model
data class SongResponse(
val data: List<Song>? = null,
val code: Int = -1,
val msg: String? = null
)

属性名称与 JSON 完全一致,任务五引入 Gson 后,按名称就能把整段 JSON 自动转换成 SongResponse 对象;任务五还会用 code == 200 判断请求是否成功。

五、编译验证

模型属于数据层,本任务不改变界面。执行菜单 Build > Make Module ‘app’,输出区没有编译错误,本任务即完成。

任务小结

Song 保存单首歌曲的信息,SongResponse 保存请求结果和歌曲列表。属性名称与 JSON 字段对应,可空类型和默认值用于处理缺失数据。列表显示和网络解析将使用这两个数据类。