Skip to content
Gson TypeAdapter & Factory generator for Kotlin data classes
Branch: master
Clone or download

Download CircleCI Android Arsenal

Kson - kotlin type adapter generator

An annotation processor generates Gson TypeAdapter from Kotlin Data Classes


By default, Gson uses reflection to read/write data from JSON. It's not only slow (benchmarks), also it breaks Kotlin's null-safe types.

For example:

// your entity class with non-nullable property
data class Entity(val id: Int)

// wrong response from server
val json = """{ "id": null }"""

// this won't throw error
val entity = gson.fromJson(json,

// throws NPE somewhere in runtime when you don't expect

In order to avoid reflection, need to create a custom TypeAdapter for every entity class. It takes time, need to write boilerplate code, tests, etc. Here this library comes, it generates TypeAdapters automatically. You just need to register generated GsonTypeAdapterFactory in your GsonBuilder.


Add @Kson annotation to your data classes and Kson will automatically generate <class name>TypeAdapter.kt files.

data class RoleEntity(
    val id: Int, 
    @SerializedName("roleName") val name: String

data class UserEntity(
    val firstname: String,
    val lastname: String,
    val roles: List<RoleEntity>

// etc

Also you can use @KsonFactory annotation to generate TypeAdapterFactory class

object FactoryProvider {

    get() = KsonFactoryProvider()


val gson = GsonBuilder()

// gson.fromJson(...)

Limitations & Known issues

Since this is an early version there are some unsupported properties

data class UnsupportedDataClass(
    @JsonAdapter(CustomAdapter::class) val id: String // custom type adapter
    val name: String = "no name" // default values
    val list: List<String?> // nullable generics
    val `natural name`: String // "natural names"


To add KSON to your project, add the following to your module's build.gradle:

repositories {

dependencies {
    compile 'dev.afanasev:kson-annotation:<version>'   
    kapt 'dev.afanasev:kson-processor:<version>'
You can’t perform that action at this time.