Go:
Робота з JSON

Як це зробити:

У Go пакет encoding/json є вашими воротами до маніпуляцій з JSON, надаючи механізми для конвертації структур даних Go в JSON (маршалінг) та назад (анмаршалінг). Нижче наведені базові приклади для початку:

Кодування (Маршалінг)

Для конвертації структури Go в JSON можна використовувати json.Marshal. Розглянемо наступну структуру Go:

package main

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

type User struct {
    ID        int      `json:"id"`
    Username  string   `json:"username"`
    Languages []string `json:"languages"`
}

func main() {
    user := User{1, "JohnDoe", []string{"Go", "JavaScript", "Python"}}
    userJSON, err := json.Marshal(user)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(userJSON))
}

Вивід:

{"id":1,"username":"JohnDoe","languages":["Go","JavaScript","Python"]}

Декодування (Анмаршалінг)

Для розбору JSON у структуру даних Go використовуйте json.Unmarshal:

package main

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

func main() {
    jsonStr := `{"id":1,"username":"JohnDoe","languages":["Go","JavaScript","Python"]}`
    var user User
    err := json.Unmarshal([]byte(jsonStr), &user)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%+v\n", user)
}

Враховуючи структуру User як раніше, цей код аналізує JSON рядок у інстанс User.

Вивід:

{ID:1 Username:JohnDoe Languages:[Go JavaScript Python]}

Поглиблене вивчення

Пакет encoding/json в Go пропонує простий API, який абстрагує багато складностей, пов’язаних з маніпуляціями JSON. Представлений на ранньому етапі розвитку Go, цей пакет відображає філософію Go простоти та ефективності. Однак використання рефлексії encoding/json для інспектування та модифікації структур в рантаймі може призвести до не найкращої продуктивності в CPU-інтенсивних сценаріях.

З’явилися альтернативи, такі як json-iterator/go та ffjson, які надають швидшу обробку JSON за рахунок генерації статичного коду маршалінгу та анмаршалінгу. Однак encoding/json залишається найбільш використовуваним пакетом через його простоту, надійність та той факт, що він є частиною стандартної бібліотеки, забезпечуючи сумісність і стабільність між версіями Go.

Незважаючи на його відносно повільну продуктивність, простота використання та інтеграція з системою типів Go роблять encoding/json підходящим для більшості застосунків. Для тих, хто працює в контекстах, де продуктивність є першочерговою, дослідження зовнішніх бібліотек може бути варте того, але для багатьох стандартна бібліотека знаходить правильний баланс між швидкістю, простотою та надійністю.