Метод 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-данных