62 / 68

encoding/json

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.

example.go
import "encoding/json"

1. Struct'ni JSON'ga aylantirish: Marshal()

example.go
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:

kod
{"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.


2. O'qishga qulay (chiroyli formatlangan) JSON: MarshalIndent()

example.go
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:

kod
{
  "name": "Ali",
  "age": 25
}

3. JSON'ni struct'ga aylantirish: Unmarshal()

example.go
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:

kod
{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).


4. Struct tuzilishini oldindan bilmasangiz: 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:

example.go
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:

kod
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, alohida struct yaratish tavsiya etiladi — bu ham xavfsizroq (kompilyator xatolarni oldindan aniqlaydi), ham tezroq ishlaydi.


5. Massivlar bilan ishlash

example.go
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:

kod
[{"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.


6. Noto'g'ri JSON bilan ishlash

example.go
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:

kod
invalid character '}' looking for beginning of value

[!WARNING] Tashqi manbadan (foydalanuvchi, API) kelgan JSON'ni har doim ishonchsiz ma'lumot deb hisoblang va Unmarshal()ning err qaytargan qiymatini albatta tekshiring — noto'g'ri formatlangan JSON dasturingizni to'satdan "panik" qildirmasligi kerak.


Xulosa: qachon qaysi funksiya kerak?

VazifaFunksiya
Struct'ni JSON'ga aylantirishjson.Marshal(v)
Chiroyli formatlangan JSONjson.MarshalIndent(v, "", " ")
JSON'ni struct'ga aylantirishjson.Unmarshal(data, &v)
Tuzilishi noma'lum JSONmap[string]interface{}
JSON maydon nomini boshqarish`json:"maydon_nomi"` tegi
Bo'sh qiymatlarni chiqarmaslik`json:"maydon,omitempty"`