encoding/json paketi
JSON (JavaScript Object Notation) — bugungi kunda API'lar, konfiguratsiya fayllari va ma'lumotlar almashinuvida eng ko'p ishlatiladigan format. encoding/json paketi Godagi structlarni JSON'ga aylantirish (marshal) va JSON'ni structga aylantirish (unmarshal) uchun ishlatiladi.
import "encoding/json"
Marshal()package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"` // struct tag: JSON'da bu maydon "name" deb yoziladi
Age int `json:"age"`
}
func main() {
p := Person{Name: "Ali", Age: 25}
data, err := json.Marshal(p)
fmt.Println(string(data))
fmt.Println(err)
}
Natija:
{"name":"Ali","age":25}
[!IMPORTANT]
json:"name"kabi yozuvlar struct tag deb ataladi. Ular Go maydon nomi (Name— katta harf bilan, chunki eksport qilingan bo'lishi shart) bilan JSON'dagi kalit nomi (name— odatda kichik harf bilan) orasidagi moslikni belgilaydi. Agar tag yozilmasa, Go maydon nomini (Name) o'zgarishsiz JSON kalitiga aylantiradi.
MarshalIndent()package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p := Person{Name: "Ali", Age: 25}
// ikkinchi parametr — chiziq boshidagi prefiks, uchinchisi — chekinish (indent)
data, _ := json.MarshalIndent(p, "", " ")
fmt.Println(string(data))
}
Natija:
{
"name": "Ali",
"age": 25
}
Unmarshal()package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email,omitempty"`
}
func main() {
jsonStr := `{"name":"Vali","age":30,"email":"vali@example.com"}`
var p Person
// &p — struct manzili beriladi, chunki Unmarshal uni to'ldirishi kerak
err := json.Unmarshal([]byte(jsonStr), &p)
fmt.Println(p)
fmt.Println(err)
}
Natija:
{Vali 30 vali@example.com}
<nil>
,omitempty tegining ma'nosi: agar Email maydoni bo'sh bo'lsa, u Marshal() qilinganda JSON natijasidan butunlay chiqarib tashlanadi (Unmarshal()ga ta'sir qilmaydi).
map[string]interface{}Agar JSON'ning aniq tuzilishi (qanday maydonlari borligi) oldindan noma'lum bo'lsa, uni to'g'ridan-to'g'ri map ko'rinishida ham qabul qilish mumkin:
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"name":"Vali","age":30}`
var generic map[string]interface{}
json.Unmarshal([]byte(jsonStr), &generic)
fmt.Println(generic["name"])
fmt.Println(generic["age"])
}
Natija:
Vali
30
[!NOTE]
map[string]interface{}orqali ishlash moslashuvchan, lekin qulay emas — chunki har bir qiymatning haqiqiy turini (interface{}dan) qayta aniqlash (type assertion) kerak bo'ladi. Imkon qadar, JSON tuzilishi ma'lum bo'lsa, alohidastructyaratish tavsiya etiladi — bu ham xavfsizroq (kompilyator xatolarni oldindan aniqlaydi), ham tezroq ishlaydi.
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
people := []Person{
{Name: "Ali", Age: 25},
{Name: "Vali", Age: 30},
}
data, _ := json.Marshal(people)
fmt.Println(string(data))
}
Natija:
[{"name":"Ali","age":25},{"name":"Vali","age":30}]
Marshal()/Unmarshal() slayslar ([]Person) bilan ham xuddi shunday tabiiy ishlaydi — struct massiv ichida bo'lsa ham, tegishli JSON massiviga aylanadi.
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
badJSON := `{"name": "Ali", "age": }` // sintaksis xato — qiymat yo'q
var p Person
err := json.Unmarshal([]byte(badJSON), &p)
fmt.Println(err)
}
Natija:
invalid character '}' looking for beginning of value
[!WARNING] Tashqi manbadan (foydalanuvchi, API) kelgan JSON'ni har doim ishonchsiz ma'lumot deb hisoblang va
Unmarshal()ningerrqaytargan qiymatini albatta tekshiring — noto'g'ri formatlangan JSON dasturingizni to'satdan "panik" qildirmasligi kerak.
| Vazifa | Funksiya |
|---|---|
| Struct'ni JSON'ga aylantirish | json.Marshal(v) |
| Chiroyli formatlangan JSON | json.MarshalIndent(v, "", " ") |
| JSON'ni struct'ga aylantirish | json.Unmarshal(data, &v) |
| Tuzilishi noma'lum JSON | map[string]interface{} |
| JSON maydon nomini boshqarish | `json:"maydon_nomi"` tegi |
| Bo'sh qiymatlarni chiqarmaslik | `json:"maydon,omitempty"` |