Как найти недействительный объект Kotlin, сгенерированный Gson (из отражения)? - PullRequest
0 голосов
/ 17 декабря 2018
{
  "data":[{"compulsory_field": 1}, {"compulsory_field": 2}, {}]
}

преобразуется в объект с помощью gson

data class Something(val compulsory_field: Int)

val somethingList = //gson parse the data
println(somethingList)

//[
//    Something(compulsory_field = 1),
//    Something(compulsory_field = 2),
//    Something(compulsory_field = null)    //Should not exists
//]

, и я хочу избавиться от 3-го элемента.Можно ли сделать это ПОСЛЕ того, как оно было преобразовано в объект?Или это можно сделать только тогда, когда это String / InputStream?И как я могу это сделать?

Спасибо!

Редактировать: уточнить, что конструктор работает, но gson не смог понять правила kotlin и внедренные объекты, которые я не могу проверить в Kotlin

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Я нашел уродливое «решение» / обходной путь, но я все еще ищу лучший ответ (или заставляю проект переключиться на кодировку moshi или что-то еще, в зависимости от того, что наступит раньше)

В основном япросто скопируйте каждый объект еще раз, чтобы убедиться, что он проходит все проверки нулевой безопасности, которые предоставляет kotlin

val somethingList = //gson parse the data
val fixedSomethingList = somethingList.mapNotNull {
    try {
    it.copy(compulsory_field = it.compulsory_field)
  } catch (e: IllegalArgumentException) { //if gson inserted a null to a non-null field, this will make it surface
    null  //set it to null so that they can be remove by mapNotNull above
  }
}

Теперь fixedSomethingList должно быть чистым.Опять очень хакерский, но работает ......

0 голосов
/ 17 декабря 2018

Если вам не нравятся пустые объекты, просто удалите их.Вы всегда должны делать это после разбора.Однако, имейте в виду, что в списках Kotlin могут быть изменчивы или нетЕсли вы получили неизменяемый (созданный с помощью «listOf»), вам нужно будет создать новый список, включающий только те элементы, которые вы хотите.

https://kotlinlang.org/docs/reference/collections.html

Отредактировано: хорошо, я понимаюВы даже не можете разобрать JSON в первую очередь.В этом случае, может быть, вы можете попробовать это:

  1. Чтобы разрешить пустые значения: измените тип поля compulsory_field с Int на Int?при объявлении
  2. Исправьте строку json перед синтаксическим анализом: в вашем случае вы можете заменить все {} на {"compulsory_field": null}
  3. Теперь парсер gson должен получить правильный список.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...