Классы данных Kotlin JSON Десериализация - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь преобразовать ApiEmployee в Employee и написал тест вокруг него.Я смущен по поводу нулей в Котлине, поскольку я новичок в этом.

ApiEmployee будет использоваться для преобразования в формате JSON, поэтому в нем может отсутствовать поле name, или оно может быть пустым или может принимать значение NULL.В этом случае я не хочу добавлять в список и безопасно игнорировать его.

Я получаю Method threw 'kotlin.KotlinNullPointerException at exception. в apiEmployee.name!!.isNotBlank()

ApiEmployee

data class ApiEmployee(val image: String? = "image",
                   val name: String? = "name test",
                   val description: String? = "",
                   val id: String? = "")

Сотрудник

data class Employee(val imagePath: String, val id: String)

EmployeeConverter (преобразует ApiEmployee в Employee)

fun apply(apiEmployees: List<ApiEmployee>): List<Employee> {
    val employees = mutableListOf<Employee>()
    for (apiEmployee in apiEmployees) {
      if (apiEmployee.name!!.isNotBlank()){
         employees.add(Employee(apiEmployee.image!!, apiEmployee.id!!)
      }
    }
}

EmployeeConverterTest

  @Test
fun `should not add employee without name into employee list`() {
  val invalidApiEmployee = ApiEmployee("image", null, "description", "id")
  val convertedEmployees : List< Employee > =  employeeConverter.apply(listOf( invalidApiEmployee))

  assertThat(convertedEmployees.size).isEqualTo(0)
}

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Что вы хотите сделать, это проверить, является ли имя пустым, а затем пустым.

val employeeNameIsNotEmpty = apiEmployee.name?.isNotBlank() ?: false
if (employeeNameIsNotEmpty) { 
    // do stuff
}

apiEmployee.name?.isNotBlank() будет работать и возвращать значение, только если имя не равно нулю.Если name равно null, то символ справа от?: Вернет свое значение, которое в этом случае должно быть ложным.

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

.isNullOrBlank ()

Так что вы можете изменить его на:

if (!apiEmployee.name.isNullOrBlank()) { 
    // do stuff
}

В качестве примечания вы действительно не хотите этого делать Employee(apiEmployee.image!!, apiEmployee.id!!).Потому что image и id все еще могут быть нулевыми и приводить к сбою вашего кода с той же ошибкой.

0 голосов
/ 04 октября 2018

Либо передайте значение имени.

ApiEmployee("image", "name", "description", "id")

(или)

Измените условие if, как указано ниже (с помощью оператора?): -

if (apiEmployee.name?.isNotBlank()){

?.выполняет безопасный вызов (вызывает метод или обращается к свойству, если получатель ненулевой)

!!утверждает, что выражение не является ненулевым

Код утверждает, что имя не является нулевым, и проверяет, не является ли оно пустым.

Возможно, я думаю, что вы пытаетесь выполнить нулевую, а не пустую проверку.Для этого вы можете использовать ? operator (safe call).Это означает, что isNotBlank() выполняется только в том случае, если имя не равно нулю.

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