Skip to content

Instantly share code, notes, and snippets.

@vorobeij
Last active October 27, 2020 09:13
Show Gist options
  • Save vorobeij/8322ab8333135fb7479d075b36579e65 to your computer and use it in GitHub Desktop.
Save vorobeij/8322ab8333135fb7479d075b36579e65 to your computer and use it in GitHub Desktop.
Gson interface adapter for "Register an InstanceCreator with Gson for this type may fix this problem"
object ConfigGson {
fun getGson() = GsonBuilder().apply {
registerTypeAdapter(Launchable::class.java, InterfaceAdapter<Launchable>())
registerTypeAdapter(Trigger::class.java, InterfaceAdapter<Trigger>())
}.create()
}
import com.google.gson.*
import java.lang.reflect.Type
class InterfaceAdapter<T> : JsonSerializer<T>, JsonDeserializer<T> {
@Throws(JsonParseException::class)
override fun deserialize(jsonElement: JsonElement, type: Type,
jsonDeserializationContext: JsonDeserializationContext): T {
val jsonObject = jsonElement.asJsonObject
val prim = jsonObject.get(CLASSNAME) as JsonPrimitive
val className = prim.asString
val klass = getObjectClass(className)
return jsonDeserializationContext.deserialize(jsonObject.get(DATA), klass)
}
override fun serialize(src: T, type: Type?, jsonSerializationContext: JsonSerializationContext?): JsonElement {
val jsonObject = JsonObject()
val name: String = (src ?: Any())::class.java.name
jsonObject.addProperty(CLASSNAME, name)
jsonObject.add(DATA, jsonSerializationContext?.serialize(src))
return jsonObject
}
/****** Helper method to get the className of the object to be deserialized */
fun getObjectClass(className: String): Class<*> {
try {
return Class.forName(className)
} catch (e: ClassNotFoundException) {
throw JsonParseException(e.message)
}
}
companion object {
private val CLASSNAME = "CLASSNAME"
private val DATA = "DATA"
}
}
val string = ConfigGson.getGson().toJson(configData)
val configData = ConfigGson.getGson().fromJson(json, ConfigData::class.java)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment