Retrofit android is a type-safe HTTP client for Android and Java. Retrofit is a REST Client for Java, Android, and Kotlin by Square inc under Apache 2.0 license. With this library or module used the in-app app for server smooth connection, like sing in sing up or downloading-uploading data.

Why Retrofit library? Because it will save your development time and also you can keep your code in developer friendly. Retrofit has given almost all the API’s to make a server call and to receive a response. Internally they also use GSON to do the parsing.

Let’s build an Example of Retrofit Android Example JSON Parser in Kotlin

In this example, we are using a simple example to connect your android application to the server using Retrofit 2 library. Let’s start building the application with simple and few steps.

Step 1. Create a new application, check this tutorial Build Your First Android App in Kotlin.

Step 2. In dependencies Gradle build.gradle (Module: app),

Add GSON and retrofit 2 dependencies, GSON retrofit dependency is converters ResponseBody to JSON object.

dependencies { .... compile 'com.squareup.retrofit2:retrofit:2.4.0' compile 'com.squareup.retrofit2:converter-gson:2.4.0' } 1 2 3 4 5 dependencies { . . . . compile 'com.squareup.retrofit2:retrofit:2.4.0' compile 'com.squareup.retrofit2:converter-gson:2.4.0' }

Retrofit requires at minimum Java 7 or Android 2.3., After adding the library just sync your project.

Step 3. For this example, we need an API

So we are using GitHub search API. https://api.github.com/search/users?q=rohitkan

Here is response formate from API, data may change time to time depends on API.

{ "total_count": 6, "incomplete_results": false, "items": [ { "login": "rohitkandhal", "id": 2447448, "node_id": "MDQ6VXNlcjI0NDc0NDg=", "avatar_url": "https://avatars1.githubusercontent.com/u/2447448?v=4", "gravatar_id": "", "url": "https://api.github.com/users/rohitkandhal", "html_url": "https://github.com/rohitkandhal", "followers_url": "https://api.github.com/users/rohitkandhal/followers", "following_url": "https://api.github.com/users/rohitkandhal/following{/other_user}", "gists_url": "https://api.github.com/users/rohitkandhal/gists{/gist_id}", "starred_url": "https://api.github.com/users/rohitkandhal/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/rohitkandhal/subscriptions", "organizations_url": "https://api.github.com/users/rohitkandhal/orgs", "repos_url": "https://api.github.com/users/rohitkandhal/repos", "events_url": "https://api.github.com/users/rohitkandhal/events{/privacy}", "received_events_url": "https://api.github.com/users/rohitkandhal/received_events", "type": "User", "site_admin": false, "score": 62.782448 }, { ...} .... ]} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 { "total_count" : 6 , "incomplete_results" : false , "items" : [ { "login" : "rohitkandhal" , "id" : 2447448 , "node_id" : "MDQ6VXNlcjI0NDc0NDg=" , "avatar_url" : "https://avatars1.githubusercontent.com/u/2447448?v=4" , "gravatar_id" : "" , "url" : "https://api.github.com/users/rohitkandhal" , "html_url" : "https://github.com/rohitkandhal" , "followers_url" : "https://api.github.com/users/rohitkandhal/followers" , "following_url" : "https://api.github.com/users/rohitkandhal/following{/other_user}" , "gists_url" : "https://api.github.com/users/rohitkandhal/gists{/gist_id}" , "starred_url" : "https://api.github.com/users/rohitkandhal/starred{/owner}{/repo}" , "subscriptions_url" : "https://api.github.com/users/rohitkandhal/subscriptions" , "organizations_url" : "https://api.github.com/users/rohitkandhal/orgs" , "repos_url" : "https://api.github.com/users/rohitkandhal/repos" , "events_url" : "https://api.github.com/users/rohitkandhal/events{/privacy}" , "received_events_url" : "https://api.github.com/users/rohitkandhal/received_events" , "type" : "User" , "site_admin" : false , "score" : 62. 782448 }, { ...} .... ]}

Step 4. Create 2 models class

Because the json itself is an array of your items objects (Retrofit can convert between json arrays to java lists). For the second json, you have just an object and not an array. For this, you need to create another call with another model that maps to that json. Let’s assume you’ve named the model UsersList . Here’s how the call could look like:

1st UsersList model, Top level – List of Users

package `in`.eyehunt.retrofitandroidexamplekotlin import com.google.gson.annotations.SerializedName class UsersList { @SerializedName("items") var users: List<Users>? = null } 1 2 3 4 5 6 package ` in ` . eyehunt . retrofitandroidexamplekotlin import com . google . gson . annotations . SerializedName class UsersList { @ SerializedName ( "items" ) var users : List < Users > ? = null }

2nd Users model, second level – Users objects

package `in`.eyehunt.retrofitandroidexamplekotlin class Users { var id: Int = 0 var login: String = "" var score: Float = 0.0f } 1 2 3 4 5 6 package ` in ` . eyehunt . retrofitandroidexamplekotlin class Users { var id : Int = 0 var login : String = "" var score : Float = 0.0f }

Step 4. Create API interface

package in.eyehunt.retrofitandroidexamplekotlin; import retrofit2.Call; import retrofit2.http.GET; public interface Api { //urls @GET("users?q=rokano") Call<UsersList> getUsers(); } 1 2 3 4 5 6 7 8 9 package in . eyehunt . retrofitandroidexamplekotlin ; import retrofit2 . Call ; import retrofit2 . http . GET ; public interface Api { //urls @ GET ( "users?q=rokano" ) Call < UsersList > getUsers ( ) ; }

Step 5. add following code in resource layout file main_activity.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="in.eyehunt.retrofitandroidexamplekotlin.MainActivity"> <TextView android:id="@+id/tv_users" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:scrollbars="vertical" android:text="Hello World!" android:textColor="@color/colorPrimaryDark" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.051" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.032" /> </android.support.constraint.ConstraintLayout> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <? xml version = "1.0" encoding = "utf-8" ?> < android . support . constraint . ConstraintLayout xmlns : android = "http://schemas.android.com/apk/res/android" xmlns : app = "http://schemas.android.com/apk/res-auto" xmlns : tools = "http://schemas.android.com/tools" android : layout_width = "match_parent" android : layout_height = "match_parent" tools : context = "in.eyehunt.retrofitandroidexamplekotlin.MainActivity" > < TextView android : id = "@+id/tv_users" android : layout_width = "wrap_content" android : layout_height = "wrap_content" android : layout_marginTop = "8dp" android : scrollbars = "vertical" android : text = "Hello World!" android : textColor = "@color/colorPrimaryDark" android : textSize = "16sp" app : layout_constraintBottom_toBottomOf = "parent" app : layout_constraintHorizontal_bias = "0.051" app : layout_constraintLeft_toLeftOf = "parent" app : layout_constraintRight_toRightOf = "parent" app : layout_constraintTop_toTopOf = "parent" app : layout_constraintVertical_bias = "0.032" / > < / android . support . constraint . ConstraintLayout >

Step 6. add following code in MainActivity kotlin class.

package `in`.eyehunt.retrofitandroidexamplekotlin import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.TextView import retrofit2.Call import retrofit2.Callback import retrofit2.Response import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory class MainActivity : AppCompatActivity() { val BASE_URL = "https://api.github.com/search/" var tv_user: TextView? = null var str:String = "" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) tv_user = findViewById(R.id.tv_users) getUsers() } // function to call server and update ui fun getUsers() { var retrofit: Retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build() var api = retrofit.create(Api::class.java) var call = api.users call.enqueue(object : Callback<UsersList> { override fun onResponse(call: Call<UsersList>?, response: Response<UsersList>?) { var usres = response?.body() var user = usres?.users var length = user!!.size for (i in 0 until length) { str = str + "

" + user.get(i).id + " " + user.get(i).login } tv_user!!.text = str } override fun onFailure(call: Call<UsersList>?, t: Throwable?) { Log.v("Error", t.toString()) } }) } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 package ` in ` . eyehunt . retrofitandroidexamplekotlin import android . support . v7 . app . AppCompatActivity import android . os . Bundle import android . util . Log import android . widget . TextView import retrofit2 . Call import retrofit2 . Callback import retrofit2 . Response import retrofit2 . Retrofit import retrofit2 . converter . gson . GsonConverterFactory class MainActivity : AppCompatActivity ( ) { val BASE_URL = "https://api.github.com/search/" var tv_user : TextView ? = null var str : String = "" override fun onCreate ( savedInstanceState : Bundle ? ) { super . onCreate ( savedInstanceState ) setContentView ( R . layout . activity_main ) tv_user = findViewById ( R . id . tv_users ) getUsers ( ) } // function to call server and update ui fun getUsers ( ) { var retrofit : Retrofit = Retrofit . Builder ( ) . baseUrl ( BASE_URL ) . addConverterFactory ( GsonConverterFactory . create ( ) ) . build ( ) var api = retrofit . create ( Api :: class . java ) var call = api . users call . enqueue ( object : Callback & lt ; UsersList & gt ; { override fun onResponse ( call : Call & lt ; UsersList & gt ; ? , response : Response & lt ; UsersList & gt ; ? ) { var usres = response ? . body ( ) var user = usres ? . users var length = user ! ! . size for ( i in 0 until length ) { str = str + "

" + user . get ( i ) . id + " " + user . get ( i ) . login } tv_user ! ! . text = str } override fun onFailure ( call : Call & lt ; UsersList & gt ; ? , t : Throwable ? ) { Log . v ( "Error" , t . toString ( ) ) } } ) } }

Step 7. add internet permissions in manifest.xml, for internet connection

Without Internet permission, Android application will raise an exception or error.

<manifest> <uses-permission android:name="android.permission.INTERNET"/> .... </manifest> 1 2 3 4 < manifest > < uses - permission android : name = "android.permission.INTERNET" / > . . . . < / manifest >

Step 8. Run the application, in the emulator or on your android device

Output screenshot Retrofit android example Json parser in kotlin

Download Retrofit android Json parser example source code :

https://github.com/EyeHunts/RetrofitAndroidExamplekotlin

Note : This example (Project) is developed in Android Studio 3.0.1 ,tested on Android 7.1.1 ( Android Nougat), compile SDK version API 26: Android 8.0 (Oreo) MinSdkVersion=”15″ TargetSdkVersion=”26″ Coding in Kotlin

Retrofit CONVERTERS

By default, Retrofit can only deserialize HTTP bodies into OkHttp’s ResponseBody type and it can only accept its RequestBody type for @Body . You can converters can add to support other types. like

Source: http://square.github.io/retrofit/

Degree in Computer Science and Engineer: App Developer and has multiple Programming languages experience. Enthusiasm for technology & like learning technical.

Share this: Facebook

WhatsApp

LinkedIn

More

Twitter

Print



Reddit

Tumblr



Pinterest

Pocket



Telegram

Skype



Email

