我是Android开发的新手,我正试图从服务器获取数据。一般的JSON响应结构如下所示
{
"success": "1",
"data": [
{
"customers_id": 4,
"customers_gender": "0",
"customers_firstname": "TES IOS",
"customers_lastname": "TES IOS",
"customers_dob": "2018-12-27",
"email": "TES002@email.com",
"user_name": "TES002",
"customers_default_address_id": 0,
"customers_telephone
},
"message": "Successfully get user data from server"
}
“Success”和“Message”字段将是相同的(将始终是字符串)。但是对于其他请求调用,“数据”可能不同。它可以发送用户数据,存储数据或产品数据,甚至是产品的数组/列表。
因此,我想创建一个通用的可重用类来捕捉JSON响应。类将如下所示,我将“data”设置为Any,然后稍后它将被铸回User Object:
class ServerData(successStatus: Int, data: Any, message: String) {
val isSuccessfull : Boolean
val data : Any
val message : String
init {
isSuccessfull = successStatus != 0
this.data = data
this.message = message
}
}
interface LakuinAPI {
@FormUrlEncoded
@POST("processlogin")
fun performLogin(
@Field("kode_customer") outletCode: String,
@Field("password") password: String
): Call<ServerData>
}
然后我在活动中使用它,如下面的代码:
private fun sendLoginDataToServer(outletCode: String, password: String) {
val call = lakuinAPI.performLogin(outletCode,password)
call.enqueue(object: Callback<ServerData> {
override fun onFailure(call: Call<ServerData>, t: Throwable) {
Toast.makeText(this@LoginActivity,t.localizedMessage,Toast.LENGTH_LONG).show()
}
override fun onResponse(call: Call<ServerData>, response: Response<ServerData>) {
if (!response.isSuccessful) {
Toast.makeText(this@LoginActivity,"Code: " + response.code(),Toast.LENGTH_LONG).show()
return
}
val lakuinServerData = response.body()
val userList = lakuinServerData?.data as List<User> // the error in here
val userData = userList.first() // the error in here
println(userData)
}
})
}
但我得到错误消息:
classCastException:com.google.gson.internal.LinkedTreeMap不能强制转换为com.ssss.lakuinkotlin.model.user
老实说,如果这是从像上面的JSON一样的一般响应JSON捕获用户数据的正确方法,我就不这么认为了。有更好的办法吗?
可以使用泛型来实现
class Response<Data> constructor() : ResponseSimple() {
@SerializedName(FIELD_DATA)
var data: Data? = null
private constructor(data: Data) : this() {
this.data = data
}
companion object {
const val FIELD_SUCCESS = "success"
const val FIELD_ERROR = "error"
const val FIELD_DATA = "data"
const val FIELD_MESSAGE = "message"
@JvmStatic
fun <Data> create(data: Data): Response<Data> {
return Response(data)
}
}
}
responseSimple
是
open class ResponseSimple {
@SerializedName(Response.FIELD_ERROR)
var error: String = ""
@SerializedName(Response.FIELD_SUCCESS)
var succes: Boolean = false
@SerializedName(Response.FIELD_MESSAGE)
var message:String = ""
}
那么api响应应该是调用
。
关于ClassCastException
,您不能仅使用作为
将ServerData
转换为User
。您需要使用调用
或创建类转换器。
我有一个基于springboot的restful Web服务。我有CryptoResponseBodyAdvision从控制器捕获响应,从响应体中创建JWE并将JWE作为API响应发送。公共类CryptoResponseBodyAdvice实现ResponseBodyAdvice 当某些异常发生并请求到达异常解决程序时,麻烦就来了。在这种异常场景中,响应不受CryptoResponseBodyAd
问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 我有一个打算用作实用程序文件的文件。该文件应包含许多静态方法。 我应该这样在类中定义方法吗: 或像这样使用它(不带类): 问题答案: 第二个选项是Python中的操作方法。我的意思是,如果您要做的只是导入函数,那么您可以执行以下操作:
问题内容: 我正在尝试使用Bokeh而不是matplotlib复制此问题中显示的HeatMap。我不能完全正确。现有的示例并没有帮助我了解我在做什么错。我卑微的尝试 给 请注意,尽管标题相似,但这并不能回答我的问题。这不是相同的错误,我正在使用Bokeh 0.12.3 问题答案: 更改数据的生成以按元素重复,并且它应该是正确的: 因此,适用于我的代码如下:
问题内容: 我对ObjectMapper的工作方式和应用程序的一般使用感到满意。我想了解的是实现ObjectMapper的最佳方法,以确保其被重用并且不会在应用程序内创建不必要的实例? 我的想法是,可以在Utils类中声明ObjectMapper,如下所示: 然后,我可以在不同的地方使用诸如以下代码来引用: 我遇到了另一个问题(我应该将杰克逊的ObjectMapper声明为静态字段吗?),这促使我
嘿,我必须使用 JOptionPane 向用户询问购买金额,如果他们输入超过小数点后两位、任何内容、字符或多于小数点,程序必须显示错误消息并停止。 我该怎么做? 我不希望有人为我编写程序,只是一个解释我将如何做的链接 如果用户输入“12.526”或“”或“1.3.25”或“abc”,我希望程序显示错误消息并停止。 由于这似乎是一个令人困惑的问题,或者我问错了,这些是我的老师的指示: 程序必须要求用
问题内容: 网页上的数据是动态显示的,似乎检查html中的每个更改并提取数据是一项非常艰巨的任务,并且还需要我使用非常不可靠的XPath。因此,我希望能够从数据包中提取数据。 我希望能够从数据包中提取信息以及生成要发送到服务器的“ XHR”数据包。提取信息部分对我来说更重要,因为通过使用casperjs自动触发html元素可以轻松处理信息的发送。 我附上我的意思的屏幕截图。 响应选项卡中的文本是我