Что такое JSON и как с ним работать в Go?

Ответ

JSON (JavaScript Object Notation) — это легковесный, текстовый формат обмена данными, основанный на синтаксисе JavaScript. Благодаря своей простоте и удобочитаемости он стал стандартом де-факто для коммуникации между веб-сервисами (API).

Основные типы данных в JSON:

  • Объект: Неупорядоченный набор пар ключ:значение в фигурных скобках {}.
  • Массив: Упорядоченный список значений в квадратных скобках [].
  • Строка: Текст в двойных кавычках "...".
  • Число: Целое или с плавающей точкой.
  • Логическое значение: true или false.
  • null: Обозначает отсутствие значения.

В Go для работы с JSON предназначен стандартный пакет encoding/json.

Основные операции:

  1. Сериализация (Marshalling): Преобразование структуры Go в JSON-строку.
  2. Десериализация (Unmarshalling): Преобразование JSON-строки в структуру Go.

Пример работы в Go:

package main

import (
    "encoding/json"
    "fmt"
)

// Используем теги для указания имен полей в JSON
type User struct {
    Name   string `json:"name"`
    Age    int    `json:"age"`
    IsActive bool   `json:"isActive"`
    Courses []string `json:"courses,omitempty"` // omitempty - не включать поле, если оно пустое
}

func main() {
    // 1. Сериализация (Go -> JSON)
    user := User{Name: "Alice", Age: 30, IsActive: true}
    jsonData, err := json.Marshal(user)
    if err != nil {
        fmt.Println("Ошибка сериализации:", err)
        return
    }
    fmt.Println("JSON:", string(jsonData)) // {"name":"Alice","age":30,"isActive":true}

    // 2. Десериализация (JSON -> Go)
    var newUser User
    err = json.Unmarshal(jsonData, &newUser)
    if err != nil {
        fmt.Println("Ошибка десериализации:", err)
        return
    }
    fmt.Printf("Go struct: %+vn", newUser) // Go struct: {Name:Alice Age:30 IsActive:true Courses:[]}
}

Ответ 18+ 🔞

А, JSON, ёпта! Ну это ж классика, блядь, как хлеб с маслом для веба. Представь себе, сидит один сервис, пыхтит, а другому надо ему данные передать. И вот они, два мудака, начинают перекрикиваться: «Эй, Вась, держи мой список покупок!». А чтобы друг друга поняли, договорились на одном языке болтать — лёгком, текстовом, на основе JavaScript. Это и есть JSON, сука.

Из чего он, этот зверь, состоит?

  • Объект: Это типа как твой бардак в комнате — куча пар «штука-значение» в фигурных скобках {}. Порядка нет, но всё на месте, блядь.
  • Массив: Упорядоченный список, как очередь в столовой, в квадратных скобках [].
  • Строка: Текст, зажатый в двойные кавычки, "...". Без них — нихуя не строка.
  • Число: Просто цифры, целые или с точкой. Никаких плясок с бубном.
  • Логическое: true или false. Всё, больше вариантов нет, ёпта.
  • null: Абсолютная пустота, нихуя. Значение отсутствует, и все дела.

В Go за всю эту магию отвечает пакет encoding/json. И делает он две главные вещи, блядь:

  1. Маршалинг (Marshalling): Берешь свою родную Go-структуру и превращаешь её в JSON-строку. Как будто переводишь с русского на язык API.
  2. Анмаршалинг (Unmarshalling): Обратный процесс, сука. Получаешь JSON-строку (допустим, из интернета) и насильно запихиваешь её в поля своей Go-структуры.

Смотри, как это в коде выглядит, на живом примере:

package main

import (
    "encoding/json"
    "fmt"
)

// Объявляем структуру. Теги `json:` — это указания, как назвать поля в JSON. Без них будут большие буквы, а это не по феншую.
type User struct {
    Name   string `json:"name"`
    Age    int    `json:"age"`
    IsActive bool   `json:"isActive"`
    Courses []string `json:"courses,omitempty"` // omitempty — гениальная штука. Если слайс пустой, поле вообще не попадёт в JSON. Красота!
}

func main() {
    // 1. Сериализация (Go -> JSON). Упаковываем данные.
    user := User{Name: "Alice", Age: 30, IsActive: true}
    jsonData, err := json.Marshal(user)
    if err != nil {
        fmt.Println("Ошибка сериализации:", err) // На всякий пожарный, вдруг структура несериализуемая, мудя.
        return
    }
    fmt.Println("JSON:", string(jsonData)) // Смотрим, что получилось: {"name":"Alice","age":30,"isActive":true}

    // 2. Десериализация (JSON -> Go). Распаковываем данные.
    var newUser User
    err = json.Unmarshal(jsonData, &newUser) // Не забудь амперсанд, а то нихуя не запишется!
    if err != nil {
        fmt.Println("Ошибка десериализации:", err)
        return
    }
    fmt.Printf("Go struct: %+vn", newUser) // И вуаля: Go struct: {Name:Alice Age:30 IsActive:true Courses:[]}
}

Вот и вся магия, блядь. Главное — структуры правильно описать и теги не забыть, а то получишь Name вместо name, и какой-нибудь питон-сервис обосрётся, не поняв тебя.