Go / JSON өгөгдөл

JSON өгөгдөл

Вэб API-тай харилцахдаа JSON форматыг хамгийн их ашигладаг. Go-ийн суурилагдсан encoding/json package нь JSON-ийг struct руу хөрвүүлэх (unmarshal) болон struct-ийг JSON руу хөрвүүлэх (marshal) бүх хэрэгслийг өгдөг.

Struct-ийг JSON руу хөрвүүлэх — Marshal

json.Marshal нь Go struct-ийг JSON bytes руу хөрвүүлдэг:

go
package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    ID       int    `json:"id"`
    Name     string `json:"name"`
    Email    string `json:"email"`
    Password string `json:"-"` // JSON-д орохгүй
}

func main() {
    user := User{
        ID:       1,
        Name:     "Бат-Эрдэнэ",
        Email:    "bat@example.com",
        Password: "нууц",
    }

    data, err := json.Marshal(user)
    if err != nil {
        fmt.Println("Marshal алдаа:", err)
        return
    }

    fmt.Println(string(data))
    // {"id":1,"name":"Бат-Эрдэнэ","email":"bat@example.com"}
}

Struct tag нь backtick (`) дотор бичигддэг:

  • `json:"id"` — JSON дахь талбарын нэрийг тодорхойлно
  • `json:"-"` — энэ талбарыг JSON-д оруулахгүй
  • `json:"phone,omitempty"` — утга хоосон бол JSON-д оруулахгүй

JSON-ийг struct руу хөрвүүлэх — Unmarshal

json.Unmarshal нь JSON bytes-ийг Go struct руу хөрвүүлдэг:

go
package main

import (
    "encoding/json"
    "fmt"
)

type Product struct {
    ID       int     `json:"id"`
    Name     string  `json:"name"`
    Price    float64 `json:"price"`
    InStock  bool    `json:"in_stock"`
}

func main() {
    jsonData := []byte(`{
        "id": 42,
        "name": "Go дэвтэр",
        "price": 25000.0,
        "in_stock": true
    }`)

    var product Product
    err := json.Unmarshal(jsonData, &product)
    if err != nil {
        fmt.Println("Unmarshal алдаа:", err)
        return
    }

    fmt.Printf("Бүтээгдэхүүн: %s\n", product.Name)
    fmt.Printf("Үнэ: %.0f ₮\n", product.Price)
    fmt.Printf("Нөөцтэй: %v\n", product.InStock)
}

JSON массив боловсруулах

JSON массивыг Go slice руу хөрвүүлэх:

go
package main

import (
    "encoding/json"
    "fmt"
)

type Article struct {
    Title  string   `json:"title"`
    Author string   `json:"author"`
    Tags   []string `json:"tags"`
}

func main() {
    jsonData := []byte(`[
        {"title": "Go хэлний давуу тал", "author": "Бат", "tags": ["go", "backend"]},
        {"title": "Goroutine тайлбар", "author": "Дорж", "tags": ["go", "concurrency"]}
    ]`)

    var articles []Article
    err := json.Unmarshal(jsonData, &articles)
    if err != nil {
        fmt.Println("Алдаа:", err)
        return
    }

    for _, a := range articles {
        fmt.Printf("Гарчиг: %s (зохиолч: %s)\n", a.Title, a.Author)
        fmt.Printf("Таг: %v\n\n", a.Tags)
    }
}

Уншихад хялбар JSON хэвлэх — MarshalIndent

API хариулт эсвэл лог файлд уншихад хялбар байдлаар хэвлэхдээ:

go
package main

import (
    "encoding/json"
    "fmt"
)

type Response struct {
    Success bool        `json:"success"`
    Message string      `json:"message"`
    Data    interface{} `json:"data,omitempty"`
}

func main() {
    resp := Response{
        Success: true,
        Message: "Амжилттай",
        Data: map[string]any{
            "user_id": 123,
            "token":   "abc123xyz",
        },
    }

    // Мөр тус бүрт 2 зай нэмнэ
    pretty, err := json.MarshalIndent(resp, "", "  ")
    if err != nil {
        fmt.Println("Алдаа:", err)
        return
    }

    fmt.Println(string(pretty))
}

Гаралт:

json
{
  "success": true,
  "message": "Амжилттай",
  "data": {
    "token": "abc123xyz",
    "user_id": 123
  }
}

Файлд JSON бичих ба унших

go
package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type Config struct {
    Host string `json:"host"`
    Port int    `json:"port"`
    Debug bool  `json:"debug"`
}

func saveConfig(cfg Config, path string) error {
    data, err := json.MarshalIndent(cfg, "", "  ")
    if err != nil {
        return err
    }
    return os.WriteFile(path, data, 0644)
}

func loadConfig(path string) (Config, error) {
    var cfg Config
    data, err := os.ReadFile(path)
    if err != nil {
        return cfg, err
    }
    err = json.Unmarshal(data, &cfg)
    return cfg, err
}

func main() {
    cfg := Config{Host: "localhost", Port: 8080, Debug: true}
    saveConfig(cfg, "config.json")

    loaded, err := loadConfig("config.json")
    if err != nil {
        fmt.Println("Алдаа:", err)
        return
    }
    fmt.Printf("Сервер: %s:%d\n", loaded.Host, loaded.Port)
}

Дараагийн хичээлд:

Go-д HTTP client ашиглан гадны API руу хүсэлт илгээх — GET, POST хүсэлт болон JSON хариуг боловсруулахыг сурна.