Нуль-безопасный ответ сети с использованием Gson и Kotlin

Предполагая, что у вас есть такой класс данных pojo, который представляет типичное представление ответа на основе gson, поступает с сервера.

data class User( @field:SerializedName("id") val id: String, @field:SerializedName("name") val name: String, @field:SerializedName("user_phone") val phone: String?) 

id и поля имени , поле телефона необязательно
Поэтому подходящая json эта модель ожидает, например:

 { "id": "someHash", "name": "John Snow" } 

Иногда сервер может отправлять json как:

 { "id": "someHash" } 

К сожалению, такой json успешно разбирается без ошибок, потому что gson использует небезопасное отражение и был написан для java. Таким образом, в результате будет испорчена модель kotlin с нулевым значением, сохраненным в ненулевом поле

Я хочу предоставить подтверждение для этой модели на уровне json-deserialization, потому что лучше получить там ошибку, а не в какой-либо другой части приложения, которая ожидает ненулевое поле.
И я ищу любое решение consize для этой проблемы.

Конечно, вы можете предоставить некоторую явную функцию проверки для каждой модели, например

 fun User.validate() { if (id == null) throw JsonParseException("'id' is null!") if (name == null) throw JsonParseException("'name' is null!") } 

и назовите его вручную в любом месте, но он создает много шаблонов, которые мы всегда стараемся избегать. И также ide предупреждает об этом, так как считает ненужную проверку нуля

Вы можете использовать пользовательский JsonDeserializer который будет проверять поля, аннотированные чем-то вроде @RequiredField и автоматически генерировать исключение, если оно равно null.

Как это сделать, вы можете найти здесь: необязательные и обязательные поля Gson

Intereting Posts