Parsing JSON with Python

⏱️4 min read

REST API ?

API merupakan singkatan dari Application Interface Programming, yang secara singkatnya API bisa digunakan oleh seorang Developer untuk mengintegrasikan aplikasi yang berada di platform ataupun perangkat yang berbeda agar bisa saling terkoneksi antara satu dengan lainnya. Kita dapat menganggap API sebagai mediator antara pengguna atau klien dan sumber daya atau web service yang ingin mereka dapatkan. Ini juga merupakan cara bagi organisasi untuk berbagi sumber daya dan informasi sambil mempertahankan keamanan, kontrol, dan autentikasi (menentukan siapa yang mendapatkan akses ke apa). Tujuan utama kenapa API digunakan dalam pembuatan sebuah software adalah untuk saling berbagi data antara aplikasi dari platform yang sama maupun yang berbeda.

Sedangkan REST merupakan kependekan dari Representational State Transfer. REST merupakan sebuah web service yang berjalan di client dan server yang bersifat stateless. Yang mempunyai arti bahwa setiap request yang dikirim oleh aplikasi maka harus menyertakan semua parameter dan datanya dengan lengkap. Secara singkat cara kerjanya adalah client akan menjalankan request ke server REST, ketika request terkirim ke server selanjutnya server akan memberikan response. Informasi ini, atau representasi, disampaikan dalam salah satu dari beberapa format melalui HTTP: JSON (Javascript Object Notation), HTML, XLT, Python, PHP, atau teks biasa. Sumber: https://www.redhat.com/en/topics/api/what-is-a-rest-api

1 Sumber:(https://www.altexsoft.com/media/2021/03/word-image.png)

Mari Kita Coba

Untuk kali ini saya menggunakan API dari Dummy JSON untuk isi data JSON kira kira seperti ini

{
  "users": [
    {
      "id": 1,
      "firstName": "Terry",
      "lastName": "Medhurst",
      "maidenName": "Smitham",
      "age": 50,
      "gender": "male",
      "email": "[email protected]",
      "phone": "+63 791 675 8914",
      "username": "atuny0",
      "password": "9uQFF1Lh",
      "birthDate": "2000-12-25",
      "image": "https://robohash.org/hicveldicta.png?size=50x50&set=set1",
      "bloodGroup": "A−",
      "height": 189,
      "weight": 75.4,
      "eyeColor": "Green",
      "hair": {
        "color": "Black",
        "type": "Strands"
      },
      "domain": "slashdot.org",
      "ip": "117.29.86.254",
      "address": {
        "address": "1745 T Street Southeast",
        "city": "Washington",
        "coordinates": {
          "lat": 38.867033,
          "lng": -76.979235
        },
        "postalCode": "20020",
        "state": "DC"
      },
      "macAddress": "13:69:BA:56:A3:74",
      "university": "Capitol University",
      "bank": {
        "cardExpire": "06/22",
        "cardNumber": "50380955204220685",
        "cardType": "maestro",
        "currency": "Peso",
        "iban": "NO17 0695 2754 967"
      },
      "company": {
        "address": {
          "address": "629 Debbie Drive",
          "city": "Nashville",
          "coordinates": {
            "lat": 36.208114,
            "lng": -86.58621199999999
          },
          "postalCode": "37076",
          "state": "TN"
        },
        "department": "Marketing",
        "name": "Blanda-O'Keefe",
        "title": "Help Desk Operator"
      },
      "ein": "20-9487066",
      "ssn": "661-64-2976",
      "userAgent": "Mozilla/5.0 ..."
    },
    {...},
    {...}
    // 30 items
  ],
  "total": 100,
  "skip": 0,
  "limit": 30
}

Pertama import library Python yang dibutuhkan

import requests
import csv

Kemudian masukkan url dari API, dan untuk mendapatkan data JSON dari API tersebut kita harus melakukan GET request terlebih dahulu.

# Kita memakai dummy data dari url berikut
url = 'https://dummyjson.com/users'

# GET Request ke endpoint API
response = requests.get(url)

Untuk mengetahui apakah GET request kita berhasil, kita perlu melakukan pengecekkan dengan memastikan bahwa Endpoint API mengembalikan response dengan HTTP code 200 atau OK

# Periksa kode HTTP selain 200
if response.status_code != 200:
    print('Status:', response.status_code, 'Ada masalah dengan permintaan. Keluar.')
    exit()

Lalu data JSON yang kita dapatkan, kita convert ke Python object.

# Load JSON encoded string ke Python object (akan mengembalikan json-encoded content dari response, jika ada.)
users = response.json()

Kita perlu definisikan key mana yang akan dipakai karena jika kita lihat respon JSON dari API tidak langsung menampilkan data user. Respon JSON tersebut menampilkan beberapa key yaitu users, total, skip, limit sebagai berikut:

{
  "users": [{...}],
  "total": 100,
  "skip": 0,
  "limit": 30
}

Maka kita perlu definisikan bahwa kita akan memakai data dari key users.

# Definisikan key mana yang mau dipakai
user_list = users['users']

Lanjut, kita mulai sesi penginputan ke CSV, pertama kita open dulu file csv dengan statement with dan dalam mode write (apabila file yang di-open belum ada, maka akan otomatis terbuat). 'w' Berarti Write, dan 'list-users.csv' adalah nama filenya.

# Masukkan ke CSV
with open('list-users.csv', 'w') as t:
    writer = csv.writer(t)

Kemudian kita buat header CSV dengan menggunakan method `writerow’

# Header CSV nya
writer.writerow(("First Name", "Last Name", "Gender", "Home Address", "City", "Company Name", "Company Address", "Company Coordinate"))

Setelah itu kita lakukan looping untuk setiap data yang kita dapat, kemudian kita parsing data tersebut dan kita tuliskan data tersebut ke dalam file CSV.

# Looping data yang di dapat
for user in user_list:
    first_name = user['firstName']
    last_name = user['lastName']
     gender = user['gender']
     home_address = user['address']['address']
     city = user['address']['city']
     company_name = user['company']['name']
     company_address = user['company']['address']['address']
     lat = user['company']['address']['coordinates']['lat']
     lng = user['company']['address']['coordinates']['lng']
     geo = f'({lat},{lng})'

     # Masukkan data tsb ke CSV mengikuti format yang sudah kita tentukan
     csv_data = (first_name, last_name, gender, home_address, city, company_name, company_address, geo)
     writer.writerow(csv_data)

Selesai. Jika kita buka file CSV hasil maka akan terlihat sebagai berikut: 2

Full Code-nya

import requests
import csv

# Kita memakai dummy data dari url berikut
url = 'https://dummyjson.com/users'

# GET Request ke endpoint API
response = requests.get(url)

# Periksa kode HTTP selain 200
if response.status_code != 200:
    print('Status:', response.status_code, 'Ada masalah dengan permintaan. Keluar.')
    exit()

# Load JSON encoded string ke Python object (akan mengembalikan json-encoded content dari response, jika ada.)
users = response.json()

# Definisikan key mana yang mau dipakai
user_list = users['users']

# Masukkan ke CSV
with open('list-users.csv', 'w') as t:
    writer = csv.writer(t)

    # Header CSV nya
    writer.writerow(("First Name", "Last Name", "Gender", "Home Address", "City", "Company Name", "Company Address", "Company Coordinate"))

    # Looping data yang di dapat
    for user in user_list:
        first_name = user['firstName']
        last_name = user['lastName']
        gender = user['gender']
        home_address = user['address']['address']
        city = user['address']['city']
        company_name = user['company']['name']
        company_address = user['company']['address']['address']
        lat = user['company']['address']['coordinates']['lat']
        lng = user['company']['address']['coordinates']['lng']
        geo = f'({lat},{lng})'

        # Masukkan data tsb ke CSV mengikuti format yang sudah kita tentukan
        csv_data = (first_name, last_name, gender, home_address, city, company_name, company_address, geo)
        writer.writerow(csv_data)