我有后端给我一些json。
我把它解析给我的班级:
class SomeData(
@SerializedName("user_name") val name: String,
@SerializedName("user_city") val city: String,
var notNullableValue: String)
使用gson转换器工厂:
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转换器错误,因为我的JSON响应中不存在notNullableValue
):
class SomeData @JvmOverloads constructor(
@SerializedName("user_name") val name: String,
@SerializedName("user_city") val city: String,
var notNullableValue: String = "")
从后端接收数据并使用没有def值的构造函数解析到我的SomeData类之后, notNullableValue == null 的值。
据我所知,Kotlin中的可空值不能为空?
答案 0 :(得分:17)
是的,那是因为你给它一个默认值。当然,它永远不会是空的。这是默认值的重点。
从构造函数中删除=""
,您将收到错误消息。
编辑:发现问题。 GSON使用具有sun.misc.Unsafe
方法的魔术allocateInstance
类,该方法显然被认为是unsafe
,因为它所做的是跳过初始化(构造函数/字段初始化器等)和安全检查。所以你的答案是为什么Kotlin非可空字段可以为空。违规代码位于com/google/gson/internal/ConstructorConstructor.java:223
有关Unsafe
课程的一些有趣详情:http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/
答案 1 :(得分:3)
尝试覆盖这样的构造函数:
class SomeData(
@SerializedName("user_name") val name: String,
@SerializedName("user_city") val city: String,
var notNullableValue: String = "") {
constructor() : this("","","")
}
现在服务器响应后,您可以检查 notNullableValue 是否为空 - 它为空