Метод json.Decoder.Decode

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

Синтаксис

goerr := decoder.Decode(v)

Пример

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

gopackage 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)
}

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

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

Пример

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

gopackage 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)
}

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

go[1 2 3 4 5]

Пример

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

gopackage 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)
}

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

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

Пример

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

gopackage 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)
}

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

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

Пример

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

gopackage 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)
  }
}

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

go"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-данных