java - 通过改造反序列化我的 JSON 响应后,我得到了空数据
问题描述
“结果”有不同的数据类型,即数组,其他是对象,所以我先反序列化它,但是在反序列化我的响应后,我得到了 JSON 的整个属性的空数据,这是我的代码,谢谢帮助
这是JSON:
{
"header": "200",
"status": "success",
"data": [
{
"id": 1,
...
...
"salary": {
"currency": "SS",
"minimum": "1",
"maximum": "12"
},
"created_at": "aa",
...
...
},
{
"id": 2,
...
...
"salary": [],
"created_at": "ss",
...
...
}
]
}
这是数据模型:
data class JobsModel(
val data: List<DataJobs>,
val header: String,
val status: String
)
data class DataJobs(
val city: String,
val company_name: String,
val country: String,
val created_at: String,
val description: String,
val id: Int,
val job_title: String,
val job_type: String,
val logo: String,
val requirement: String,
val responsibility: String,
val salary: Salary,
val share_url: String
)
data class Salary(
val currency: String,
val maximum: String,
val minimum: String
)
这是反序列化器类
class DataStateDeserializer : JsonDeserializer<JobsModel> {
override fun deserialize(
json: JsonElement?,
typeOfT: Type?,
context: JsonDeserializationContext?
): JobsModel {
val jobsModel = Gson().fromJson(json, JobsModel::class.java)
val jsonObject = json?.asJsonObject
if (jsonObject != null) {
if (jsonObject.has("salary")) {
val element = jsonObject.get("salary")
if (element != null) {
if (element.isJsonPrimitive || element.isJsonArray) {
element.asJsonArray
}
} else {
element?.asJsonArray
jobsModel.header
}
}
}
return jobsModel
}
}
这是改造
class ServiceFactory {
private fun retrofit(): Retrofit {
val gson = GsonBuilder()
.registerTypeAdapter(DataJobs::class.java,DataStateDeserializer())
.create()
val okHttpClient = OkHttpClient().newBuilder()
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
.callTimeout(30, TimeUnit.SECONDS)
.build()
return Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient)
.build()
}
fun instanceServices(): Services {
return retrofit().create(Services::class.java)
}
}
解决方案
我看到在一种情况下,您的薪水字段是对象,在另一种情况下是数组,但是您的模型只能包含具有已定义类的对象:
val salary: Salary
不确定,但可能你应该使用这样的东西:
val salary: Any
推荐阅读
- javascript - 使用 Plotly.js 和 Node.js 获取和绘制数据
- apache-kafka - Kstream 的成本与 KTable 相对于状态存储的成本
- c++ - 构建对象数组是如何工作的?我坚持这个例子
- c# - 如何将嵌套的父节点添加到现有节点
- android - 使用 WebRTC Android 回声
- php - PHP 变化?从网址到 /
- c# - 为什么我以后不能通过 if 语句向我的字符串变量添加一个值并在 C# 中运行输出代码?
- sql-server - 按一列有效地对查询进行分组,取另一列的最大值和来自同一行的第三列作为最大值列
- security - KRACK 补丁如何发挥作用
- python - 使用python在网页上单击“加载更多”