【发布时间】:2020-01-21 21:09:25
【问题描述】:
注意:这里是新手,如果我需要提供更多信息或澄清任何事情,请告诉我。
为您提供一些背景信息:我正在练习使用许多 Retrofit 方法构建一个 Messenger 克隆应用程序。为此,我使用了一个小型本地 JSON 服务器,应用程序与之通信。
当应用程序的用户创建帐户时,应用程序使用以下方法在 JSON 服务器中创建配置文件对象:
@FormUrlEncoded
@POST("profiles")
suspend fun createProfile(@Field("username") username: String?,
@Field("picture") picture: String?,
@Field(value = "nickname") nickname: String?,
@Field(value = "contacts") contacts: ArrayList<String?>,
@Field(value = "status") status: Int?): Response<Profile>
最初,contacts ArrayList 是空的,因为用户还没有添加任何联系人。为联系人参数创建一个带有空 ArrayList() 的随机配置文件,这是 JSON 服务器内部的结果:
{
"username": "username.example",
"picture": "picture's URL",
"nickname": "Nikola",
"status": 1,
"id": 4
}
在应用程序中代表 Profile 模型的类是这样的:
class Profile(
val username: String? = "",
var picture: String? = "",
var nickname: String? = "",
var contacts: ArrayList<String?>? = ArrayList(),
var status: Int? = 1,
val id: Int? = 0
)
创建个人资料后,用户自然可以添加新联系人,使用以下方法:
@FormUrlEncoded
@PATCH("profiles/{id}")
suspend fun addContact(@Path("id") id: Int?,
@Field("contacts") contacts: ArrayList<String?>?): Response<Profile>
这就是问题发生的地方,在添加的第一个联系人中。发送到服务器的 ArrayList 仅包含一项,JSON 服务器中的结果如下所示:
{
"username": "username.example",
"picture": "picture's URL",
"nickname": "Nikola",
"status": 1,
"id": 4,
"contacts": "first.contact"
}
基本上,因为arraylist 只包含一项,所以它将它保存为一个字符串。这会在以后产生各种问题,因为一旦应用程序对该配置文件使用了@GET 方法,它就需要一个 ArrayList 作为联系人属性,但它会收到一个字符串。
如何使 JSON 配置文件如下所示:
{
"username": "username.example",
"picture": "picture's URL",
"nickname": "Nikola",
"status": 1,
"id": 4,
"contacts": ["first.contact"]
}
contacts 参数必须是一个数组,即使其中只有一项。
【问题讨论】:
标签: android json kotlin retrofit