Повторение encoding/json
Выполняйте маршалинг и демаршалинг JSON
«Повторение encoding/json» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
JSON в Go
JSON — самый распространённый формат данных для API. Стандартный пакет Go encoding/json преобразует значения Go в текст JSON и обратно.
Marshal: из Go в JSON
json.Marshal преобразует значение Go в срез байтов JSON. Преобразуйте его в строку, чтобы вывести.
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := map[string]int{"a": 1, "b": 2}
b, _ := json.Marshal(data)
fmt.Println(string(b))
}Сериализация структуры
Структуры сериализуются поле за полем. Экспортируемые поля становятся ключами JSON.
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string
Age int
}
func main() {
b, _ := json.Marshal(User{"Ann", 30})
fmt.Println(string(b))
}Unmarshal: из JSON в Go
json.Unmarshal разбирает байты JSON и записывает результат в значение Go. Передайте указатель, чтобы функция могла заполнить вашу переменную.
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string
Age int
}
func main() {
var u User
json.Unmarshal([]byte("{\"Name\":\"Bob\",\"Age\":25}"), &u)
fmt.Println(u)
}Теги для имён ключей
Используйте теги json для управления именами ключей, как описано ранее. Здесь Name сопоставляется с именем ключа JSON.
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string "json:\"name\""
}
func main() {
b, _ := json.Marshal(User{"Ann"})
fmt.Println(string(b))
}Всегда проверяйте ошибки
И Marshal, и Unmarshal возвращают ошибку. В настоящем коде никогда не игнорируйте её: некорректный JSON или неподдерживаемые типы приводят к ошибкам.
package main
import (
"encoding/json"
"fmt"
)
func main() {
var v int
err := json.Unmarshal([]byte("not json"), &v)
fmt.Println(err)
}Декодирование в карты
Если заранее неизвестна структура данных, выполните десериализацию в map[string]interface{}.
package main
import (
"encoding/json"
"fmt"
)
func main() {
var m map[string]interface{}
json.Unmarshal([]byte("{\"x\":1,\"y\":\"hi\"}"), &m)
fmt.Println(m["x"], m["y"])
}Срезы и массивы
Массивы JSON соответствуют срезам Go. Сериализация среза создаёт массив JSON.
package main
import (
"encoding/json"
"fmt"
)
func main() {
b, _ := json.Marshal([]string{"a", "b", "c"})
fmt.Println(string(b))
}Форматированный вывод
json.MarshalIndent добавляет отступы для удобного чтения вывода.
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := map[string]int{"a": 1}
b, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(b))
}Числа имеют тип float64
При декодировании в interface{} все числа JSON в Go становятся значениями типа float64. Если нужен тип int, выполните явное преобразование.
package main
import (
"encoding/json"
"fmt"
)
func main() {
var v interface{}
json.Unmarshal([]byte("42"), &v)
fmt.Printf("%T %v\n", v, v)
}Преобразование туда и обратно
Можно сначала сериализовать данные, а затем десериализовать их, чтобы передать копию через JSON. Для поддерживаемых типов значения восстанавливаются без изменений.
package main
import (
"encoding/json"
"fmt"
)
func main() {
orig := []int{1, 2, 3}
b, _ := json.Marshal(orig)
var back []int
json.Unmarshal(b, &back)
fmt.Println(back)
}Быстрая проверка
Почему необходимо передавать указатель в json.Unmarshal?
Итоги
encoding/json:
json.Marshalпреобразует значения Go в JSONjson.Unmarshalразбирает JSON по указателю- Теги переименовывают ключи; при декодировании в interface{} числа становятся значениями типа float64
- Всегда проверяйте возвращённую ошибку
Часто задаваемые вопросы
Урок «Повторение encoding/json» бесплатный?
Да — полный текст урока «Повторение encoding/json» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Повторение encoding/json»?
Выполняйте маршалинг и демаршалинг JSON Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Повторение encoding/json»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Повторение encoding/json
- encoding/xml
- encoding/csv
- gob и двоичное кодирование