Как обрабатывать нулевые случаи для GSON в kotlin? - PullRequest
0 голосов
/ 14 января 2020

Я начинаю переходить с java на kotlin. У меня есть следующий класс данных:

data class NetworkResponse constructor(val title: String)

Этот класс будет позже использоваться GSON для преобразования json в объект этого класса. но есть вероятность, что title может получить null.

В java Это не было проблемой во время преобразования из json в объект (но поскольку я не использую нотацию ? со строкой, это может быть), но это определенно проблема при хранении данных в Room db, потому что там я не хочу добавлять нулевые значения, и я использую тот же класс, что и @Entity.

в java, я использовал makeadd logi c для преобразования значения null в Some (например, uuid) в установщиках, но здесь я не могу сделать это, потому что конструктор не имеет тела и я должен использовать init, что означает, что я должен объявить свои переменные вне конструктора, что также не относится к классу data. Что я могу сделать, чтобы:

  1. У меня все еще есть data класс
  2. У меня есть все мои переменные только в конструкторе
  3. У меня есть все мои переменные только с типом T, но не T? (т. е. не обнуляемым)
  4. при преобразовании объекта JSONString в объект класса Response, я могу создать уникальный экземпляр даже для данных, допускающих значение NULL (например, если я получаю переменную id как ноль, я все еще могу создать экземпляр, и лог c должен работать так: if value==null, return <results from my logic for creating a random id>
  5. Я должен иметь больший контроль над определением логики преобразования, указанной в пункте 4 (например, для Если id получает null, я могу использовать сложные логики c для генерации уникального идентификатора, но если, скажем, img_url получает null, я могу просто сохранить его как "no data" (т.е. несколько логик для другой тип нулевого преобразования))
  6. Я бы предпочел, если бы эта проблема решалась с помощью kotlin, а не с помощью хакеров сторонних разработчиков из Gson или Room

1 Ответ

0 голосов
/ 15 января 2020

Если есть вероятность, что вы получите нулевое значение для одного из типов параметров ответа, вы должны выбрать один из следующих параметров:

  1. Измените тип на nullable, поэтому:

    data class NetworkResponse constructor(val title: String?)

  2. Установите значение по умолчанию для параметра, например, так:

    data class NetworkResponse constructor(val title: String = "")

Если Вы хотите выполнить более сложную логику c, если это значение равно нулю, вы также можете зарегистрировать JsonDeserializer и записать логи c, чтобы преобразовать пустое / пустое значение в любое значение:

GsonBuilder().registerTypeAdapter(type, MyCustomJsonDeserializer())

Надеюсь, это поможет!

...