Ответ
JSON (JavaScript Object Notation) — это легковесный, текстовый формат обмена данными, основанный на синтаксисе JavaScript. Благодаря своей простоте и удобочитаемости он стал стандартом де-факто для коммуникации между веб-сервисами (API).
Основные типы данных в JSON:
- Объект: Неупорядоченный набор пар
ключ:значениев фигурных скобках{}. - Массив: Упорядоченный список значений в квадратных скобках
[]. - Строка: Текст в двойных кавычках
"...". - Число: Целое или с плавающей точкой.
- Логическое значение:
trueилиfalse. null: Обозначает отсутствие значения.
В Go для работы с JSON предназначен стандартный пакет encoding/json.
Основные операции:
- Сериализация (Marshalling): Преобразование структуры Go в JSON-строку.
- Десериализация (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. И делает он две главные вещи, блядь:
- Маршалинг (Marshalling): Берешь свою родную Go-структуру и превращаешь её в JSON-строку. Как будто переводишь с русского на язык API.
- Анмаршалинг (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, и какой-нибудь питон-сервис обосрётся, не поняв тебя.