Instruction 2

Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.

Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.

Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.

Unlock now

Connecting Moshi with Retrofit

Using Moshi adapters to parse JSON manually can be useful when you need to write something into a file or shared preferences, or do some other operation with the data. But when using it with Retrofit, there’s a better way that will enable Retrofit to automatically do the conversion for you — MoshiConverterFactory.

Adding the Moshi Converter

To integrate Moshi with Retrofit, you include the Moshi converter factory when building the Retrofit instance. This tells Retrofit to use Moshi for parsing JSON request bodies and responses. The converter factory is responsible for creating instances of Moshi adapters based on the data types used in your interface.

Defining Custom Models

Until now, you’ve worked with RequestBody and ResponseBody for sending and receiving data through Retrofit. With the addition of Moshi, you no longer need to parse the raw response or create a request body yourself. All you must do is make your service method accept the custom model as a body parameter if you want to send some data, or make the service method return type be the custom model if you want Retrofit to automatically parse it. Here’s an example:

@GET("user")
fun getUser(): Call<UserResponse>

Changing Property Names

By default, Moshi tries to parse JSON fields into Kotlin properties with the same name. Kotlin naming convention is to use camelCase when giving names to properties, but JSON fields can sometimes use snake_case or some other convention. You can use @Json to specify how Kotlin properties map to JSON names. Here’s an example:

"last_name": "Kordic",
data class User(
  @Json(name = "last_name") val lastName: String,
)

Omitting Fields & Properties

Moshi considers every property in a class when converting it to JSON or parsing JSON into an instance of a class. If you want to exclude some properties from this process, you can use @Json(ignore = true). The following code is an example of this:

data class User(
  val lastName: String,
  @Json(ignore = true)
  val address: String = "placeholder address"
)
{
  "lastName": "Kordic"
}
{
  "lastName": "Kordic",
  "address": "Osijek"
}
User(lastName=Kordic, address=placeholder address)
See forum comments
Download course materials from Github
Previous: Demo 1 Next: Demo 2