Код вашего приложения (клиента) ожидает объект в соответствии с контрактом, указанным в классе, который вы передаете GSON.Ваше приложение ведет себя как следует и громко вылетает.Вам следует подумать о том, чтобы ваш сервер возвращал "u_owner_mi" : null
вместо пустой строки, предполагая, что у вас есть контроль над этим.Поле u_owner_mi
на стороне клиента должно иметь тип , допускающий значение nullable .
Если у вас нет возможности исправить API, вы также можете написать собственный десериализатор.
Предположим, что ваш класс результата и подобъект:
data class Result(
val parent: String,
val owner: Any?
)
data class Owner(
val link: String,
val value: String
)
Десериализатор может быть:
class ResultDeserializer : JsonDeserializer<Result> {
override fun deserialize(json: JsonElement, typeOfT: Type?, context: JsonDeserializationContext?): Result {
val jsonObject = json.asJsonObject
val ownerProperty = jsonObject.get("owner")
return Result(
parent = jsonObject.get("parent").asString,
owner = if (ownerProperty.isJsonObject) context?.deserialize<Owner>(ownerProperty.asJsonObject, Owner::class.java)
else ownerProperty.asString
)
}
}
Наконец, чтобы добавить десериализатор:
@Test
fun deserialization() {
val gson = GsonBuilder().registerTypeAdapter(Result::class.java, ResultDeserializer()).create()
val result1 = gson.fromJson<Result>(jsonWithObject, Result::class.java)
val result2 = gson.fromJson<Result>(jsonWithEmpty, Result::class.java)
}