Функция json.Unmarshal
Функция json.Unmarshal преобразует JSON-данные в значения Go.
Она принимает два параметра: слайс байтов с JSON-данными и указатель
на переменную, в которую нужно сохранить результат. Функция возвращает
ошибку, если декодирование не удалось. Для корректного преобразования
целевая структура должна иметь соответствующие поля с тегами json.
Синтаксис
json.Unmarshal(data, &v)
Пример
Давайте декодируем простой JSON-объект в структуру:
package 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)
}
Результат выполнения кода:
{John 30}
Пример
Давайте декодируем JSON-массив в слайс структур:
package 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)
}
Результат выполнения кода:
[{John 30} {Jane 25}]
Пример
Давайте декодируем JSON с вложенными объектами:
package 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)
}
Результат выполнения кода:
{John 30 {New York 10001}}
Пример
Давайте декодируем JSON в map с динамическими ключами:
package 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)
}
Результат выполнения кода:
map[age:30 city:New York name:John]
Пример
Давайте обработаем ошибку при декодировании некорректного JSON:
package 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)
}
Результат выполнения кода:
"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,
который откладывает декодирование до момента выполнения