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 хариуг боловсруулахыг сурна.