在分页代码实验室中有这段代码:
/**
* Immutable model class for a Github repo that holds all the information about a repository.
* Objects of this type are received from the Github API, therefore all the fields are annotated
* with the serialized name.
* This class also defines the Room repos table, where the repo [id] is the primary key.
*/
@Entity(tableName = "repos")
data class Repo(
@PrimaryKey @field:SerializedName("id") val id: Long,
@field:SerializedName("name") val name: String,
@field:SerializedName("full_name") val fullName: String,
@field:SerializedName("description") val description: String?,
@field:SerializedName("html_url") val url: String,
@field:SerializedName("stargazers_count") val stars: Int,
@field:SerializedName("forks_count") val forks: Int,
@field:SerializedName("language") val language: String?
)
为什么需要所有这些注释?他们做什么?
答案 0 :(得分:0)
它们来自json形式的api。 json具有键值结构,其中具有名称和值,以便注释指示要查找的键,然后返回值,在这种情况下为长字符串和整数。我希望我足够清楚。 =)
答案 1 :(得分:0)
想象一下该数据库记录:
id: 21434366,
name: "John",
full_name: "John Doe",
number_of_github_repository: 4
每个字段的键均以小写字母,下划线分隔。但是,字段/变量的通用命名约定是基于驼峰大小写的。
不是将字段名本身用作变量名
val number_of_github_repository: Int
我们都喜欢这个
val numOfGithubRepos: Int
这就是@field:SerializedName批注起作用的地方。如果用实际的数据库字段名对变量名进行注释,则程序将从已注释的名称中找到值,并将其分配给您的自定义变量名。
例如,
@field:SerializedName("number_of_github_repositories") val numOfGithubRepos: Int
这将从数据库字段“ number_of_github_repositories”中查找值,并将其分配给变量numOfGithubRepos。
GSON库也是如此。它将不需要/无组织的字段名称转换为您首选的变量名称。默认情况下,GSON库尝试从Json响应中查找与声明的变量名称匹配的字段。因此,如果您只声明没有注释的字段,例如
val numOfGithubRepos: Int
,如果实际的Json对象是
{num_of_github_repositories: 4}
它将抛出异常,因为Json响应中没有名称为numOfGithubRepos
的字段。