JSON serialization and generics in Kotlin.


Sometimes when developing an app, you need to introduce some complexity in order to keep your code neat and clean.

Applying this idea to a bicycle, an internal-gear hub part comes to my mind: the interaction with it is simple and makes life easier if you stop-and-go when commuting in a big city. On the other hand, it is a complex and expensive component.

Curiously, the same example can be found inside Fidesmo app codebase:

The easy interaction

We use a version of the Either<A,B> pattern redefined as Result<T,E>. Popular in languages like Scala, Elm or Rust, it is fantastic because it wraps a value of type T inside a “request context”, where E is the error obtained if the request fails. Although you can find many implementations around, let’s type a simple one:

The complex part

As we are using a Redux like architecture inside Fidesmo app, the Result<A,B> is part of our state and it must be serialized!! 😱

How to serialize a sealed class with generics? In theory, we should add a custom adapter to the Google Gson lib that let’s us customize the JSON (de)codification. This adapter could have the follow structure:

Result<T, E> detection

In order to pass the previous serializer to the Gson implementation, we need something that detects the whole hierarchy of our sealed class: Result.Loading, Result.Ok<T> or Result.Err<E>.

And voilá, The registerTypeHierarchyAdapter comes to help us:

Result<T, E> serialization

About codification, we have predefined that we’ll save only the Ok result and discard the other states. A pattern matching can help us to execute the correct action for each case:

Result<T, E> deserialization

Ok, fasten your seat-belts:


Making an application (or software in general) is a matter of decisions, most of them are not transcendental but seen together as a whole can lead your code to a land of pleasure full of unicorns or to terrible hell.

In our case, the introduction of a complex module in benefit of the overall simplicity is a good one though :)