kotlinx.serialization: JSON deserializer with a fallback

Alex Vanyo
Livefront

--

In a perfect world, the consumer and producer of an API would always be in lockstep, only changing with each other and adhering to the strictest of contracts. Alas, we live in the real world, and it helps to be a bit pessimistic when controlling data falls just outside of your grasp.

If you are the consumer of an API, sometimes there might be a reasonable fallback if deserialization goes horribly wrong. In other words, we want a KSerializer that will fall back to some default value if deserialization fails:

This extension of KSerializer is modeled heavily after KSerializer.nullable: it augments an existing KSerializer with a bit of extra functionality. In this case, we wrap the deserialization call in a try/catch, returning the provided default value if any exception occurred during deserialization.

Now, putting it to use: for forwards-compatibility reasons, it can be helpful to allow enums to take a default UNKNOWN value. Like the name suggests, we want any unknown value to be turned into UNKNOWN instead of causing an error:

With the fallback serializer above, that’s all there is to it!

October 2020 edit: Updated to match kotlinx.serialization 1.0.0 interface.

Alex works at Livefront, where we always try to leave data a little bit cleaner than when we get it.

--

--