首页 > 解决方案 > 通过改造反序列化我的 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)
    }
}

标签: javaandroidjsonkotlinretrofit

解决方案


我看到在一种情况下,您的薪水字段是对象,在另一种情况下是数组,但是您的模型只能包含具有已定义类的对象:

val salary: Salary

不确定,但可能你应该使用这样的东西:

val salary: Any

推荐阅读