50. JSON

JSON atau Javascript Object Notation adalah notasi standar yang umum digunakan untuk komunikasi data via web. JSON merupakan subset dari javascript.

Golang menyediakan package encoding/json yang berisikan banyak fungsi untuk kebutuhan operasi json.

Di bab ini, kita akan belajar cara untuk konverstri string yang berbentuk json menjadi objek golang, dan sebaliknya.

50.1. Decode JSON Ke Variabel Objek Cetakan Struct

Di Golang data json tipenya adalah string. Dengan menggunakan json.Unmarshal, json string bisa dikonversi menjadi bentuk objek, entah itu dalam bentuk map[string]interface{} ataupun variabel objek hasil struct.

Program berikut ini adalah contoh cara decoding json ke bentuk objek. Pertama import package yang dibutuhkan, lalu siapkan struct User.

package main

import "encoding/json"
import "fmt"

type User struct {
    FullName string `json:"Name"`
    Age      int
}

Hasil decode nantinya akan disimpan ke variabel objek cetakan struct User.

Selanjutnya siapkan data json string sederhan. Perlu dilakukan casting ke tipe []byte, karena fungsi json.Unmarshal hanya menerima data bertipe []byte.

func main() {
    var jsonString = `{"Name": "john wick", "Age": 27}`
    var jsonData = []byte(jsonString)

    var data User

    var err = json.Unmarshal(jsonData, &data)
    if err != nil {
        fmt.Println(err.Error())
        return
    }

    fmt.Println("user :", data.FullName)
    fmt.Println("age  :", data.Age)
}

Dalam penggunaan fungsi json.Unmarshal, variabel penampung hasil decode harus di-pass dalam bentuk pointer, contohnya seperti &data.

Decode data json ke variabel objek

Bisa dilihat bahwa salah satu property struct User, yaitu FullName memiliki tag json:"Name". Tag tersebut digunakan untuk mapping data json ke property yang bersangkutan.

Data json yang akan diparsing memiliki 2 property yaitu Name dan Age. Kebetulan penulisan Age pada data json dan pada struktur struct adalah sama, berbeda dengan Name yang tidak ada pada struct.

Property FullName struct tersebut kemudian ditugaskan untuk menampung data json property Name, ditandai dengan penambahan tag json:"Name" pada saat deklarasi struct-nya.

Perlu diketahui bahwa untuk decode data json ke variabel objek hasil struct, semua level akses property struct-nya harus publik.

50.2. Decode JSON Ke map[string]interface{} & interface{}

Tak hanya ke objek cetakan struct, target decoding data json juga bisa berupa variabel bertipe map[string]interface{}.

var data1 map[string]interface{}
json.Unmarshal(jsonData, &data1)

fmt.Println("user :", data1["Name"])
fmt.Println("age  :", data1["Age"])

Variabel bertipe interface{} juga bisa digunakan untuk menampung hasil decode. Dengan catatan pada pengaksesan nilai property, harus dilakukan casting terlebih dahulu ke map[string]interface{}.

var data2 interface{}
json.Unmarshal(jsonData, &data2)

var decodedData = data2.(map[string]interface{})
fmt.Println("user :", decodedData["Name"])
fmt.Println("age  :", decodedData["Age"])

50.3. Decode Array JSON Ke Array Objek

Decode data dari array json ke slice/array objek masih sama, siapkan saja variabel penampung hasil decode dengan tipe slice struct. Contohnya bisa dilihat pada kode berikut.

var jsonString = `[
    {"Name": "john wick", "Age": 27},
    {"Name": "ethan hunt", "Age": 32}
]`

var data []User

var err = json.Unmarshal([]byte(jsonString), &data)
if err != nil {
    fmt.Println(err.Error())
    return
}

fmt.Println("user 1:", data[0].FullName)
fmt.Println("user 2:", data[1].FullName)

50.4. Encode Objek Ke JSON

Setelah sebelumnya dijelaskan beberapa cara decode data dari json json ke objek, sekarang kita akan belajar cara encode data objek ke bentuk json string.

Fungsi json.Marshal digunakan untuk decoding data ke json string. Sumber data bisa berupa variabel objek cetakan struct, map[string]interface{}, atau slice.

Pada contoh berikut, data slice struct dikonversi ke dalam bentuk json string. Hasil konversi berupa []byte, casting terlebih dahulu ke tipe string agar bisa ditampilkan bentuk json string-nya.

var object = []User{{"john wick", 27}, {"ethan hunt", 32}}
var jsonData, err = json.Marshal(object)
if err != nil {
    fmt.Println(err.Error())
    return
}

var jsonString = string(jsonData)
fmt.Println(jsonString)

Output:

Encode data ke JSON

results matching ""

    No results matching ""