Skip to content
/ kson Public

Gson TypeAdapter & Factory generator for Kotlin data classes

License

Notifications You must be signed in to change notification settings

aafanasev/kson

Folders and files

NameName
Last commit message
Last commit date

Latest commit

a43edac · Oct 18, 2021

History

97 Commits
Mar 12, 2020
Sep 24, 2021
Sep 19, 2021
Oct 3, 2021
Oct 3, 2021
Oct 3, 2021
May 25, 2018
Oct 18, 2021
Mar 15, 2020
Oct 18, 2021
Oct 2, 2021
May 13, 2018
May 13, 2018
May 29, 2018
Oct 3, 2021

Repository files navigation

maven Android Arsenal

Kson - kotlin type adapter generator

An annotation processor generates Gson TypeAdapter from Kotlin Data Classes

Motivation

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, Entity::class.java)

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

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.

Usage

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

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

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

// etc

Also you can use @KsonFactory annotation to generate TypeAdapterFactory class

@KsonFactory
object FactoryProvider {

    get() = KsonFactoryProvider()

}

val gson = GsonBuilder()
    .registerTypeAdapterFactory(FactoryProvider.get())
    .create()

// gson.fromJson(...)

Limitations & Known issues

Since this is an early version there are some unsupported properties

@Kson
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"
)

Installation

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

repositories {
    jcenter()
}

dependencies {
    compile 'dev.afanasev:kson-annotation:<version>'   
    kapt 'dev.afanasev:kson-processor:<version>'
}

Mentions

Code of Conduct

Please refer to Code of Conduct document.

About

Gson TypeAdapter & Factory generator for Kotlin data classes

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages