Kotlin object deserialization using GSON

I have a class

class ThreadComment( banned: Int, closed: Int, comment: String?, date: String?, email: String?, files: ArrayList<File>?, lasthit: Int, name: String?, num: String?, op: Int, parent: String?, postsCount: Int, sticky: Int, subject: String?, tags: String?, timestamp: Int, trip: String?) : Comment(banned, closed, comment, date, email, files, lasthit, name, num, op, parent, postsCount, sticky, subject, tags, timestamp, trip) { val answers: ArrayList<String> = ArrayList()} 

Parent class looks like

 open class Comment( @com.google.gson.annotations.SerializedName("banned") val banned: Int = 0, @com.google.gson.annotations.SerializedName("closed") val closed: Int = 0, @com.google.gson.annotations.SerializedName("comment") val comment: String? = null, @com.google.gson.annotations.SerializedName("date") val date: String? = null, @com.google.gson.annotations.SerializedName("email") val email: String? = null, @com.google.gson.annotations.SerializedName("files") val files: ArrayList<File>? = null, @com.google.gson.annotations.SerializedName("lasthit") val lasthit: Int = 0, @com.google.gson.annotations.SerializedName("name") val name: String? = null, @com.google.gson.annotations.SerializedName("num") val num: String? = null, @com.google.gson.annotations.SerializedName("op") val op: Int = 0, @com.google.gson.annotations.SerializedName("parent") val parent: String? = null, @com.google.gson.annotations.SerializedName("posts_count") val postsCount: Int = 0, @com.google.gson.annotations.SerializedName("sticky") val sticky: Int = 0, @com.google.gson.annotations.SerializedName("subject") val subject: String? = null, @com.google.gson.annotations.SerializedName("tags") val tags: String? = null, @com.google.gson.annotations.SerializedName("timestamp") val timestamp: Int = 0, @com.google.gson.annotations.SerializedName("trip") val trip: String? = null) : Serializable 

But after deserializing with the GSON response, the field is null. Debugger

I also tried putting init init in init {}, but it is still null, lazy throwing an exception about calling lazy.getValue to refer to a null object

+5
source share
2 answers

As described in this Gson answer, you can handle the args constructor no scripts without any problems. He does this using UnsafeAllocator , which in turn uses allocateInstane(Class p) . This means that when there is no no-args constructor and no custom instance creator , the registered object created by Gson will have fields initialized with the standard values ​​of the declared types .

To resolve this, add the constructor no-arg ie

 private constructor() : this(-1, -1, "", "", "", null, -1, "", "", -1, null, -1, -1, null, null, -1, null) 

Or add default parameter values ​​to your main constructor, for example:

 class ThreadComment( banned: Int = -1, closed: Int = -1, comment: String? = null, date: String? = null, email: String? = null, files: ArrayList<File>? = null, lasthit: Int = -1, name: String? = null, num: String? = null, op: Int = -1, parent: String? = null, postsCount: Int = -1, sticky: Int = -1, subject: String? = null, tags: String? = null, timestamp: Int = -1, trip: String? = null ) : Comment(banned, closed, comment, date, email, files, lasthit, name, num, op, parent, postsCount, sticky, subject, tags, timestamp, trip) { val answers: ArrayList<String> = ArrayList() } 
+4
source

This is strange, I just used @SerializedName, as usual, in Java with a data class, and it worked:

 data class(@SerializedName("my_string_value") val myStringValue: String, @SerializedName("my_int_value") val myIntValue: Int) 
+7
source

Source: https://habr.com/ru/post/1257473/


All Articles