Функция json.Unmarshal

Функция json.Unmarshal преобразует JSON-данные в значения Go. Она принимает два параметра: слайс байтов с JSON-данными и указатель на переменную, в которую нужно сохранить результат. Функция возвращает ошибку, если декодирование не удалось. Для корректного преобразования целевая структура должна иметь соответствующие поля с тегами json.

Синтаксис

gojson.Unmarshal(data, &v)

Пример

Давайте декодируем простой JSON-объект в структуру:

gopackage main

import (
  "encoding/json"
  "fmt"
)

type Person struct {
  Name string `json:"name"`
  Age  int  `json:"age"`
}

func main() {
  jsonData := []byte(`{"name":"John","age":30}`)
  var person Person

  err := json.Unmarshal(jsonData, &person)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println(person)
}

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

go{John 30}

Пример

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

gopackage main

import (
  "encoding/json"
  "fmt"
)

type Person struct {
  Name string `json:"name"`
  Age  int  `json:"age"`
}

func main() {
  jsonData := []byte(`[{"name":"John","age":30},{"name":"Jane","age":25}]`)
  var people []Person

  err := json.Unmarshal(jsonData, &people)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println(people)
}

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

go[{John 30} {Jane 25}]

Пример

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

gopackage main

import (
  "encoding/json"
  "fmt"
)

type Address struct {
  City  string `json:"city"`
  Zip   string `json:"zip"`
}

type Person struct {
  Name  string  `json:"name"`
  Age   int   `json:"age"`
  Address Address `json:"address"`
}

func main() {
  jsonData := []byte(`{"name":"John","age":30,"address":{"city":"New York","zip":"10001"}}`)
  var person Person

  err := json.Unmarshal(jsonData, &person)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println(person)
}

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

go{John 30 {New York 10001}}

Пример

Давайте декодируем JSON в map с динамическими ключами:

gopackage main

import (
  "encoding/json"
  "fmt"
)

func main() {
  jsonData := []byte(`{"name":"John","age":30,"city":"New York"}`)
  var result map[string]interface{}

  err := json.Unmarshal(jsonData, &result)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println(result)
}

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

gomap[age:30 city:New York name:John]

Пример

Давайте обработаем ошибку при декодировании некорректного JSON:

gopackage main

import (
  "encoding/json"
  "fmt"
)

type Person struct {
  Name string `json:"name"`
  Age  int  `json:"age"`
}

func main() {
  jsonData := []byte(`{"name":"John","age":"thirty"}`)
  var person Person

  err := json.Unmarshal(jsonData, &person)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println(person)
}

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

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

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

  • функцию json.Marshal,
    которая преобразует значения Go в JSON-данные
  • функцию json.MarshalIndent,
    которая преобразует значения Go в отформатированный JSON
  • функцию json.Valid,
    которая проверяет валидность JSON-данных
  • тип json.RawMessage,
    который откладывает декодирование до момента выполнения