Moshi Made Simple: @JsonQualifier

Moshi has some nice bells and whistles that aren’t present in Gson. One of my favorite ones is @JsonQualifier. This feature lets you roll custom annotations that control how deserialization is performed.

Recently I was working with an API that would wrap all its responses inside an extra JSON Object:

Deserializing this blob required creating a wrapper object, SecuritiesResponse, which had a field named securities. As I started using more endpoints with similar semantics, I ended up having to create an extra wrapper object per endpoint — yuck!

@JsonQualifier to the Rescue

To avoid this, I rolled a custom annotation that could be tacked onto any Retrofit API:

I then wrote a custom JsonAdapter.Factory that handles deserializing endpoints annotated with @Enveloped and plugged it into my Moshi instance using moshiBuilder.add(EnvelopeFactory.INSTANCE):

For the JSON blob above, instead of returning a wrapper object, my Retrofit API now looks like:

Where Securities holds a reference to a list of Security objects.

I love qualifiers for handling custom deserialization semantics like this because they’re easy to write and can be reused across endpoints. Drop me a comment and let me know your favorite use cases for @JsonQualifer!