Я получил нулевые данные после десериализации моего ответа JSON с модификацией - PullRequest
0 голосов
/ 19 сентября 2019

Существует другой тип данных для «результата», то есть массив, а остальные - объект, поэтому сначала я делаю десериализацию, но я получил нулевые данные для всех свойств 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)
    }
}

1 Ответ

0 голосов
/ 19 сентября 2019

Я видел, что в одном случае ваше поле зарплаты является объектом, а в другом случае массивом, но ваша модель может содержать только объект с определенным классом:

val salary: Salary

Не уверен, но, возможно, вам следует что-то использоватькак это:

val salary: Any
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...