2017-08-21 33 views
5

Bana biraz json döndüren arka tarafım var.Kotlin null değersiz değer boş olamaz?

class SomeData(
    @SerializedName("user_name") val name: String, 
    @SerializedName("user_city") val city: String, 
    var notNullableValue: String) 

Kullanım GSON çevirici fabrika:

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(ENDPOINT) 
    .client(okHttpClient) 
    .addConverterFactory(GsonConverterFactory.create(gson)) 
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
    .build(); 

Ve arabiriminde:

benim sınıfa ayrıştırmak

interface MyAPI { 
    @GET("get_data") 
    Observable<List<SomeData>> getSomeData(); 
} 

Sonra sunucudan veri (almak rxJava ile) herhangi bir hata olmadan. Ben (notNullableValue benim JSON yanıt olarak mevcut olmadığı için, GSON dönüştürücü hatayı önlemek için) böyle bir şey yapması gerektiğini düşündük çünkü ben bir hata beklenen: Veri arka sunucudan alınan ve ayrıştırılır sonra

class SomeData @JvmOverloads constructor(
    @SerializedName("user_name") val name: String, 
    @SerializedName("user_city") val city: String, 
var notNullableValue: String = "") 

benim Def değeri olmayan kuruculu SomeData sınıfı, noNullableValue == null değeri.

Anlayamadığım kadarıyla nilüble değeri Kotlin'de boş olabilir mi?

+0

Lütfen bunun yardımcı olup olmadığına bakın: https://stackoverflow.com/a/39963353/2196460 – hotkey

+0

Onun açıklaması kurucudaki def değerine sahip durum. Ama benim durumumda değerim yok. – jQuick

+0

"notNullableValue", oluşturulduktan sonra gson tarafından değiştirildi. çünkü "var" değil "val". –

cevap

9

Evet, bunun nedeni, varsayılan bir değer vermenizdir. Tabii ki asla boş olamaz. Bu, varsayılan bir değerin bütünüdür.

Kurucudan ="" çıkarın ve bir hata iletisi alırsınız.

Düzenleme: Sorunu bulduk. GSON, unsafe numaralı allocateInstance yöntemine sahip sihirli sun.misc.Unsafe sınıfını kullanmaktadır. Bu yöntem, başlangıçta atlamayı (yapıcılar/alan başlatıcıları ve benzerleri) ve güvenlik kontrollerini atladığı için çok önemlidir. Öyleyse cevaben, bir Kotlin null olmayan alanın null olabileceği cevabınız var.

class SomeData(
     @SerializedName("user_name") val name: String, 
     @SerializedName("user_city") val city: String, 
     var notNullableValue: String = "") { 
    constructor() : this("","","") 
} 

Şimdi sunucusu yanıtı sonra notNullableValue kontrol edebilirsiniz boş değil: http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

+0

Hayır, tüm işleri doğru şekilde okuduğunuzda = "" olmadan düzeltin. Ve notNullableValue == null – jQuick

+0

Yanlış anlamadığım için özür dilerim, sorumu düzenliyorum. – jQuick

+0

@jQuick Cevabımı güncelledim. TLDR: Gson güvensiz java sihirli sınıfları kullanıyor. – Strelok

0

deneyin böyle yapıcı geçersiz kılmak için: kusurlu kodu Unsafe sınıfı hakkında com/google/gson/internal/ConstructorConstructor.java:223

Bazı ilginç ayrıntıda gizlidir - boş

İlgili konular