How to parse JSON in Android using Kotlin

Last updated on: February 1, 2022

We’re going to parse JSON without using any 3rd party library but using the java class JSONTokener.

With the JSONTokener, we can parse a JSON string into an object. These objects can be cast as JSONObject or as JSONArray. In that way, we’ll be able to read the JSON values.

I’ll cover 3 cases that may you face when you’re trying to parse JSON:

  • Simple JSON: Just a simple JSON without any complex structure
  • Array JSON: The JSON structure begins with an array and without a key
  • Nested JSON: Includes nested objects

Simple JSON

A simple JSON doesn’t have any complex structure, like arrays, nested objects, e.t.c, and it looks like that:

{ "id": "1", "employee_name": "Jack Full", "employee_salary": "300800", "employee_age": "61" }
Code language: Swift (swift)

After getting the response from the HTTP request, you parse the JSON string into JSONObject, to get the JSON values:

val jsonObject = JSONTokener(response).nextValue() as JSONObject // ID val id = jsonObject.getString("id") Log.i("ID: ", id) // Employee Name val employeeName = jsonObject.getString("employee_name") Log.i("Employee Name: ", employeeName) // Employee Salary val employeeSalary = jsonObject.getString("employee_salary") Log.i("Employee Salary: ", employeeSalary) // Employee Age val employeeAge = jsonObject.getString("employee_age") Log.i("Employee Age: ", employeeAge)
Code language: Kotlin (kotlin)

Array JSON

Sometimes, you might see a JSON start with an array and without having a key:

[ { "id": "1", "employee_name": "Tiger Nixon", "employee_salary": "320800", "employee_age": "61" }, { "id": "2", "employee_name": "Garrett Winters", "employee_salary": "170750", "employee_age": "63" }, // ... ]
Code language: Swift (swift)

After getting the response, you parse the JSON string into a JSONArray, and you’re looping through the array to get the JSON values.

val jsonArray = JSONTokener(response).nextValue() as JSONArray for (i in 0 until jsonArray.length()) { // ID val id = jsonArray.getJSONObject(i).getString("id") Log.i("ID: ", id) // Employee Name val employeeName = jsonArray.getJSONObject(i).getString("employee_name") Log.i("Employee Name: ", employeeName) // Employee Salary val employeeSalary = jsonArray.getJSONObject(i).getString("employee_salary") Log.i("Employee Salary: ", employeeSalary) // Employee Age val employeeAge = jsonArray.getJSONObject(i).getString("employee_age") Log.i("Employee Age: ", employeeAge) // Save data using your Model // Notify the adapter } // Pass adapter to the RecyclerView adapter
Code language: Kotlin (kotlin)

Tip: If a key does not exist in some objects, you can set it as optional like this:
val id = jsonArray.getJSONObject(i).optString(“id”)

Nested JSON


When a JSON object is inside another JSON object, it’s called ‘nested’ and will look like the following JSON structure:

{ "data": [ { "id": "1", "employee": { "name": "Tiger Nixon", "salary": { "usd": 320800, "eur": 273545 }, "age": "61" } }, { "id": "2", "employee": { "name": "Garrett Winters", "salary": { "usd": 170750, "eur": 145598 }, "age": "63" } }, // ... ] }
Code language: Swift (swift)

After getting the response, you parse the JSON string into a JSONObject. Then you get the “data” as a JSONArray and loop it through the array.

val jsonObject = JSONTokener(response).nextValue() as JSONObject val jsonArray = jsonObject.getJSONArray("data") for (i in 0 until jsonArray.length()) { // ID val id = jsonArray.getJSONObject(i).getString("id") Log.i("ID: ", id) // Employee val employee = jsonArray.getJSONObject(i).getJSONObject("employee") // Employee Name val employeeName = employee.getString("name") Log.i("Employee Name: ", employeeName) // Employee Salary val employeeSalary = employee.getJSONObject("salary") // Employee Salary in USD val employeeSalaryUSD = employeeSalary.getInt("usd") Log.i("Employee Salary in USD: ", employeeSalaryUSD.toString()) // Employee Salary in EUR val employeeSalaryEUR = employeeSalary.getInt("eur") Log.i("Employee Salary: ", employeeSalaryEUR.toString()) // Employee Age val employeeAge = employee.getString("age") Log.i("Employee Age: ", employeeAge) // Save data using your Model // Notify the adapter } // Pass adapter to the RecyclerView adapter
Code language: Kotlin (kotlin)
You can find the final project here

If you have any questionsplease feel free to leave a comment below

Subscribe
Notify of
guest
6 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

Get once a week my latest tutorials right in your inbox

Check your inbox to confirm your email