У меня есть backend, которые возвращают мне немного json.
Я разбираю его в своем классе:
class SomeData( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String)
Используйте gson converter factory:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(ENDPOINT) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build();
И в моем интерфейсе:
interface MyAPI { @GET("get_data") Observable<List<SomeData>> getSomeData(); }
Затем я получаю данные с сервера (с rxJava) без каких-либо ошибок. Но я ожидал ошибку, потому что я думал, что должен сделать что-то вроде этого (чтобы предотвратить ошибку конвертера GSON, потому что notNullableValue
не присутствует в моем ответе JSON):
class SomeData @JvmOverloads constructor( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String = "")
После того, как данные получены из бэкэнд и проанализированы в моем классе SomeData с конструктором без значения def, значение notNullableValue == null .
Насколько я понимаю, значение недействительного значения может быть нулевым в Котлине?
Да, это потому, что вы даете ему значение по умолчанию. Конечно, он никогда не будет нулевым. В этом весь смысл значения по умолчанию.
Remove =""
из конструктора, и вы получите сообщение об ошибке.
Изменить: обнаружена проблема. GSON использует магический класс sun.misc.Unsafe
который имеет метод sun.misc.Unsafe
который, очевидно, считается очень unsafe
потому что он выполняет функцию инициализации пропусков (конструкторы / инициализаторы полей и т. П.) И проверки безопасности. Итак, есть ваш ответ, почему поле Kotlin с непустым значением может быть нулевым. Оскорбительный код находится в com/google/gson/internal/ConstructorConstructor.java:223
Некоторые интересные подробности о классе Unsafe
: http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/
Попробуйте переопределить конструктор следующим образом:
class SomeData( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String = "") { constructor() : this("","","") }
Теперь после ответа сервера вы можете проверить, что notNullableValue не имеет значения null – его пустой