РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1134 of 1593 menu

Метод json.Decoder.Decode

Метод json.Decoder.Decode используется для чтения JSON-данных из потока ввода (например, из HTTP-ответа, файла или сетевого соединения) и их декодирования в Go-структуру, карту или слайс. В качестве единственного параметра метод принимает указатель на переменную, в которую нужно сохранить распарсенные данные. Метод возвращает ошибку error, которую необходимо обрабатывать. В отличие от json.Unmarshal, работающего с байтовым срезом, json.Decoder.Decode удобен для потоковой обработки больших JSON-данных, так как читает их частями, не загружая весь объем в память.

Синтаксис

err := decoder.Decode(v)

Пример

Декодируем JSON-строку с данными пользователя в структуру:

package main import ( "encoding/json" "fmt" "strings" ) type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email"` } func main() { jsonData := `{"name":"John Doe","age":30,"email":"john@example.com"}` reader := strings.NewReader(jsonData) decoder := json.NewDecoder(reader) var user User err := decoder.Decode(&user) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Name: %s, Age: %d, Email: %s", user.Name, user.Age, user.Email) }

Результат выполнения кода:

"Name: John Doe, Age: 30, Email: john@example.com"

Пример

Декодируем JSON-массив в слайс целых чисел:

package main import ( "encoding/json" "fmt" "strings" ) func main() { jsonData := `[1, 2, 3, 4, 5]` reader := strings.NewReader(jsonData) decoder := json.NewDecoder(reader) var numbers []int err := decoder.Decode(&numbers) if err != nil { fmt.Println("Error:", err) return } fmt.Println(numbers) }

Результат выполнения кода:

[1 2 3 4 5]

Пример

Декодируем JSON-данные с вложенными структурами:

package main import ( "encoding/json" "fmt" "strings" ) type Address struct { City string `json:"city"` Country string `json:"country"` } type Person struct { Name string `json:"name"` Age int `json:"age"` Address Address `json:"address"` } func main() { jsonData := `{"name":"Alice","age":25,"address":{"city":"New York","country":"USA"}}` reader := strings.NewReader(jsonData) decoder := json.NewDecoder(reader) var person Person err := decoder.Decode(&person) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("%s (%d) lives in %s, %s", person.Name, person.Age, person.Address.City, person.Address.Country) }

Результат выполнения кода:

"Alice (25) lives in New York, USA"

Пример

Обрабатываем ошибки декодирования некорректного JSON:

package main import ( "encoding/json" "fmt" "strings" ) type User struct { Name string `json:"name"` Age int `json:"age"` } func main() { jsonData := `{"name":"Bob","age":"thirty"}` // age должно быть числом reader := strings.NewReader(jsonData) decoder := json.NewDecoder(reader) var user User err := decoder.Decode(&user) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Name: %s, Age: %d", user.Name, user.Age) }

Результат выполнения кода:

"Error: json: cannot unmarshal string into Go struct field User.age of type int"

Пример

Потоковое декодирование нескольких JSON-объектов:

package main import ( "encoding/json" "fmt" "strings" ) func main() { jsonData := `{"id":1,"value":"first"} {"id":2,"value":"second"} {"id":3,"value":"third"}` reader := strings.NewReader(jsonData) decoder := json.NewDecoder(reader) for { var item map[string]interface{} err := decoder.Decode(&item) if err != nil { break } fmt.Printf("Item: %v\n", item) } }

Результат выполнения кода:

"Item: map[id:1 value:first]" "Item: map[id:2 value:second]" "Item: map[id:3 value:third]"

Смотрите также

  • функцию json.Unmarshal,
    которая декодирует JSON из байтового среза
  • метод json.Encoder.Encode,
    который кодирует Go-значение в JSON и записывает в поток
  • функцию json.Marshal,
    которая преобразует Go-значение в JSON
  • функцию json.Valid,
    которая проверяет корректность JSON-данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить