2017-05-22 4 views
1

Im ein wenig für meine Kotlin Klasse verwirrt nicht wie erwartet:Kotlin Datenklasse Gson Serialisierung Ausgabe

die Datenklasse zu überprüfen, aktualisieren Informationen verwendet:

data class UpdateInfo constructor(//kotlin class 
    val description: String, 
    val force: Int, 
    val platform: String, 
    val title: String, 
    val url: String, 
    @SerializedName("version") 
    val versionCode: Int = 0 
) : Serializable { 
    val isForceUpdate = force == 1 
} 

auch ein util verwendet zu dekodieren Objektform json:

public class JsonUtil {//java class 
    private static final Gson gson; 
    static { 
     BooleanAdapter booleanAdapter = new BooleanAdapter(); 
     gson = new GsonBuilder() 
      .serializeNulls() 
      .disableHtmlEscaping() 
      .setLenient() 
      .registerTypeAdapter(Boolean.class, booleanAdapter) 
      .registerTypeAdapter(boolean.class, booleanAdapter) 
      .create(); 
    } 
} 

, wenn ich es testen:

val json = "{\"force\"=\"1\"}" 
val info = JsonUtil.fromJsonObject(json, UpdateInfo::class.java) 
println(info) 
println(info.force == 1) 
println(info.isForceUpdate) 

ich:

UpdateInfo(description=null, force=1, platform=null, title=null, url=null,versionCode=0) 
true 
false 

Was ?? info.isForceUpdate = falsch ???
Dann habe ich versucht lateinit oder by lazy{}, immer noch nicht funktioniert. Also, was soll ich tun..Ich benutze info.force==1 direkt jetzt, aber ich möchte immer noch wissen, warum das passiert ist.

+0

Überprüfen Sie, ob dies hilft: http://StackOverflow.com/questions/39962284/Gson-Deserialization-with-Kotlin-Initializer-Block-not-called – hotkey

+0

Wenn Sie möchten, dass Ihr Konstruktor von der Serialisierungsbibliothek ordnungsgemäß aufgerufen wird (anstatt "Unsafe" zu verwenden, um es zu instanziieren), könnten Sie an [Moshi] interessiert sein (https://medium.com/square-corner-blog/kotlins-a-great-language-for-json-fcd6ef99256b), was in mancher Hinsicht als Nachfolger von Gson gesehen werden kann. –

Antwort

2

Das Problem ist, dass die Eigenschaft val isForceUpdate = force == 1 einmal bei der Instantiierung der Klasse berechnet und dann in einem Feld gespeichert wird. Da Gson verwendet, um die Klasse zu instanziieren, wird das Feld auf seinen Standardwert false festgelegt.

Alles, was Sie tun müssen, um dieses Problem beheben ist die Eigenschaft eine berechnete Eigenschaft ändern:

val isForceUpdate get() = force == 1 

so dass der Wert auf jeden Anruf berechnet wird und nicht in einem Feld gespeichert.

+0

danke, es funktioniert. – XieEDeHeiShou

Verwandte Themen