> For the complete documentation index, see [llms.txt](https://davidwinalda94.gitbook.io/mastering-golang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://davidwinalda94.gitbook.io/mastering-golang/json-data.md).

# JSON Data

**JSON** atau *Javascript Object Notation* adalah notasi standar yang umum digunakan untuk komunikasi data di dalam web.

Go menyediakan package `encoding/json` yang berisikan banyak fungsi untuk kebutuhan operasi dan manipulasi json.

### Decode JSON ke Struct

Kita akan melakukan decode dari data JSON ke dalam Struct.

Terdapat data JSON dengan nilai berikut:

```go
jsonString := `{"Name": "David Winalda", "Age": 27}`
```

Lalu kita juga akan membuat `struct` bernama `User` yang memiliki 2 properti

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

Untuk melakukan decode, kita akan menggunakan fungsi dari package `json` yaitu `json.Unmarshal` yang membutuhkan 2 parameter. Parameter pertama adalah data JSON yang harus bertipe `[]byte` . Oleh karena itu nantinya kita harus melakukan casting dari data JSON berbentuk `string` ke dalam `[]byte` . Parameter kedua adalah `pointer` dari `struct` yang akan menampung hasilnya.

```go
jsonData := []byte(jsonString)

var user User

err := json.Unmarshal(jsonData, &user)
```

Kode lengkapnya dapat dilihat di bawah ini:

```go
package main

import (
	"encoding/json"
	"fmt"
)

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

func main() {
	jsonString := `{"Name": "David Winalda", "Age": 27}`
	jsonData := []byte(jsonString)

	var user User

	err := json.Unmarshal(jsonData, &user)

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Println("User:", user.FullName)
	fmt.Println("Age:", user.Age)
}
```

Jika dilihat, ada yang berbeda pada `struct` yang telah kita buat. Pada struct `User`, salah satu property-nya yaitu `FullName` memiliki **tag** `json:"Name"`. Tag tersebut digunakan untuk mapping informasi 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.

Dengan menambahkan tag json, maka property `FullName` struct akan secara otomatis menampung data json property `Name`.

![Menampilkan data struct hasil decode dari JSON](/files/-MTBbA4n_g8uOfMoMVdA)

### Decode JSON ke Map dan Interface

Kita juga bisa melakukan decode dari JSON ke dalam `map[string]interface{}` dan `interface{}` .

```go
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	jsonString := `{"Name": "David Winalda", "Age": 27}`
	jsonData := []byte(jsonString)

	var user map[string]interface{}

	err := json.Unmarshal(jsonData, &user)

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Println("User:", user["Name"])
	fmt.Println("Age:", user["Age"])
}
```

![Menampilkan data map\[string\]interface{} hasil decode dari JSON](/files/-MTBfNN9h-eZBIuK7RqL)

```go
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	jsonString := `{"Name": "David Winalda", "Age": 27}`
	jsonData := []byte(jsonString)

	var user interface{}

	err := json.Unmarshal(jsonData, &user)

	decodedData := user.(map[string]interface{})

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Println("User:", decodedData["Name"])
	fmt.Println("Age:", decodedData["Age"])
}
```

Untuk melakukan decode dari ke data `interface{}` , kita harus melakukan casting ke dalam `map[string]interface{}` seperti berikut ini:

```go
decodedData := user.(map[string]interface{})
```

![Menampilkan data map\[string\]interface{} hasil decode dari JSON](/files/-MTBgKW1nZUbGUMtQ8FP)

### Encode Slice Struct ke dalam JSON

Sebelumnya kita sudah melakukan decode data dari JSON, sekarang kita akan membahas cara **encode** data slice struct ke bentuk JSON.

Fungsi `json.Marshal` digunakan untuk encoding data ke JSON. Sumber data bisa berupa variabel dengan tipe data struct, `map[string]interface{}`, atau slice.

Pada contoh berikut, data slice struct dikonversi ke dalam bentuk JSON. Hasil konversi berupa `[]byte`, maka akan kita casting terlebih dahulu ke tipe `string` untuk bisa ditampilkan bentuk JSON string-nya.

```go
package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	Fullname string
	Age      int
}

func main() {
	data := []User{{"David Winalda", 26}, {"Vennika Qashash", 25}}
	jsonData, err := json.Marshal(data)

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	jsonString := string(jsonData)
	fmt.Println(jsonString)
}
```

![](/files/-MTBjZxd5AwxwdvL2xMU)
