0Pricing
Go Academy · Урок

Повторение 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 в JSON
  • json.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 — локальная установка не требуется.

Все уроки этого курса

  1. Повторение encoding/json
  2. encoding/xml
  3. encoding/csv
  4. gob и двоичное кодирование
← Назад к Go Academy