В данном руководстве будет показано, как работать с JSON в Golang.
Содержание статьи
- JSON в Golang
- Кодирование в формат JSON в Golang
- Декодирование данных из JSON в Golang
- Аккуратный вывод формата JSON в Golang
- Открываем JSON файл в Golang
- Загружаем JSON по ссылке используя HttpClient
JSON в Golang
JSON (JavaScript Object Notation) является форматом обмена данными. Он не только легко читается и записывается людьми, но и без проблем анализируется и генерируется машинами. application/json является официальным Интернет медиа типом для JSON. Названием файлового расширения JSON является .json.
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
Пакет encoding/json имплементирует кодирование и декодирование JSON.
Кодирование в формат JSON в Golang
Функция Marshal кодирует данные в формат JSON.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package main import ( "encoding/json" "fmt" "log" ) type User struct { Id int Name string Occupation string } func main() { u1 := User{1, "John Doe", "gardener"} json_data, err := json.Marshal(u1) if err != nil { log.Fatal(err) } fmt.Println(string(json_data)) users := []User{ {Id: 2, Name: "Roger Roe", Occupation: "driver"}, {Id: 3, Name: "Lucy Smith", Occupation: "teacher"}, {Id: 4, Name: "David Brown", Occupation: "programmer"}, } json_data2, err := json.Marshal(users) if err != nil { log.Fatal(err) } fmt.Println(string(json_data2)) } |
В данном примере мы трансформируем структуру и срез структуры в формат JSON.
|
1 2 3 4 5 |
type User struct { Id int Name string Occupation string } |
Мы объявляем структуру User.
|
1 |
u1 := User{1, "John Doe", "gardener"} |
Создаем экземпляр структуры.
|
1 |
json_data, err := json.Marshal(u1) |
Кодируем структуру u1 в JSON с помощью функции Marshal.
|
1 |
fmt.Println(string(json_data)) |
Так как json_data является байтовым массивом, мы конвертируем его в строку с помощью строковой функции.
|
1 2 3 4 5 |
users := []User{ {Id: 2, Name: "Roger Roe", Occupation: "driver"}, {Id: 3, Name: "Lucy Smith", Occupation: "teacher"}, {Id: 4, Name: "David Brown", Occupation: "programmer"}, } |
У нас есть срез users.
|
1 |
json_data2, err := json.Marshal(users) |
Кодируем срез users через функцию Marshal.
|
1 |
fmt.Println(string(json_data2)) |
Выводим закодированный срез.
|
1 2 3 4 |
$ go run encoding.go {"Id":1,"Name":"John Doe","Occupation":"gardener"} [{"Id":2,"Name":"Roger Roe","Occupation":"driver"},{"Id":3,"Name":"Lucy Smith","Occupation":"teacher"}, {"Id":4,"Name":"David Brown","Occupation":"programmer"}] |
Таков результат вывода.
Декодирование данных из JSON в Golang
Функция Unmarshal декодирует данные формата JSON в Go структуру.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package main import ( "encoding/json" "fmt" "log" ) type User struct { Id int Name string Occupation string } func main() { var u1 User data := []byte(`{ "Id" : 1, "Name": "John Doe", "Occupation": "gardener" }`) err := json.Unmarshal(data, &u1) if err != nil { log.Fatal(err) } fmt.Println("Struct is:", u1) fmt.Printf("%s is a %s.\n", u1.Name, u1.Occupation) var u2 []User data2 := []byte(` [ {"Id":2,"Name":"Roger Roe","Occupation":"driver"}, {"Id":3,"Name":"Lucy Smith","Occupation":"teacher"}, {"Id":4,"Name":"David Brown","Occupation":"programmer"} ]`) err2 := json.Unmarshal(data2, &u2) if err2 != nil { log.Fatal(err2) } for i := range u2 { fmt.Println(u2[i]) } } |
Мы декодируем JSON в структуру и срез структур Go.
|
1 2 3 4 5 |
data := []byte(`{ "Id" : 1, "Name": "John Doe", "Occupation": "gardener" }`) |
У нас есть объект JSON, который преобразуется в байты.
|
1 |
err := json.Unmarshal(data, &u1) |
Декодируем структуру u1 из формата JSON в структуру через функцию Unmarshal.
|
1 |
var u2 []User |
Декларируем срез структуры User.
|
1 2 3 4 5 6 |
data2 := []byte(` [ {"Id":2,"Name":"Roger Roe","Occupation":"driver"}, {"Id":3,"Name":"Lucy Smith","Occupation":"teacher"}, {"Id":4,"Name":"David Brown","Occupation":"programmer"} ]`) |
Данный массив JSON будет декодирован в срез.
|
1 |
err2 := json.Unmarshal(data2, &u2) |
Мы декодируем JSON-массив в срез через функцию Unmarshal.
|
1 2 3 4 |
for i := range u2 { fmt.Println(u2[i]) } |
Выводим декодированный JSON массив, пользователь за пользователем.
|
1 2 3 4 5 6 |
$ go run decoding.go Struct is: {1 John Doe gardener} John Doe is a gardener. {2 Roger Roe driver} {3 Lucy Smith teacher} {4 David Brown programmer} |
Таков результат вывода.
Аккуратный вывод формата JSON в Golang
Аккуратно вывести данные JSON можно с помощью функции MarshalIndent.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package main import ( "encoding/json" "fmt" "log" ) func main() { birds := map[string]interface{}{ "sounds": map[string]string{ "pigeon": "coo", "eagle": "squak", "owl": "hoot", "duck": "quack", "cuckoo": "ku-ku", "raven": "cruck-cruck", "chicken": "cluck", "rooster": "cock-a-doodle-do", }, } data, err := json.MarshalIndent(birds, "", " ") if err != nil { log.Fatal(err) } fmt.Println(string(data)) } |
В данном примере у нас есть карта звуков, которые произносят разные птицы. Результат вывода приводится в более красивый вид с помощью функции MarshalIndent.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ go run pretty_print.go { "sounds": { "chicken": "cluck", "cuckoo": "ku-ku", "duck": "quack", "eagle": "squak", "owl": "hoot", "pigeon": "coo", "raven": "cruck-cruck", "rooster": "cock-a-doodle-do" } } |
Мы видим вывод с отступами, который читается намного удобнее.
Открываем JSON файл в Golang
В следующем примере, JSON будет открываться из файла.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[ { "name": "John Doe", "occupation": "gardener", "born": "1992-03-02" }, { "name": "Brian Flemming", "occupation": "teacher", "born": "1967-11-22" }, { "name": "Lucy Black", "occupation": "accountant", "born": "1995-04-07" }, { "name": "John Doe", "occupation": "gardener", "born": "1972-08-30" } ] |
Сохраните вышеуказанные данные в файле data.json.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package main import ( "encoding/json" "fmt" "io/ioutil" "log" "os" ) type User struct { Name string Occupation string Born string } func main() { filename, err := os.Open("data.json") if err != nil { log.Fatal(err) } defer filename.Close() data, err := ioutil.ReadAll(filename) if err != nil { log.Fatal(err) } var result []User jsonErr := json.Unmarshal(data, &result) if jsonErr != nil { log.Fatal(jsonErr) } fmt.Println(result) } |
Данный пример читает JSON из файла и декодирует их в срез структуры с пользователями.
|
1 2 3 |
$ go run read_json.go [{John Doe gardener 1992-03-02} {Brian Flemming teacher 1967-11-22} {Lucy Black accountant 1995-04-07} {John Doe gardener 1972-08-30}] |
Таков результат вывода.
Загружаем JSON по ссылке используя HttpClient
Пакет net/http предоставляет HTTP клиент и сервер.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "time" ) type Astronaut struct { Name string Craft string } type people struct { Number int People []Astronaut Message string } func main() { url := "http://api.open-notify.org/astros.json" var netClient = http.Client{ Timeout: time.Second * 10, } res, err := netClient.Get(url) if err != nil { log.Fatal(err) } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) fmt.Println(body) if err != nil { log.Fatal(err) } astros := people{} jsonErr := json.Unmarshal(body, &astros) if jsonErr != nil { log.Fatal(jsonErr) } fmt.Println(astros) } |
Данный пример читает данные от веб-сервиса, используя встроенный в Go HTTP-клиент. Мы выполняем GET запрос к сервису, который возвращает данные об астронавтах Международной Космической Станции.
|
1 2 |
$ go run astros.go {3 [{Chris Cassidy ISS} {Anatoly Ivanishin ISS} {Ivan Vagner ISS}] success} |
На данный момент на Космической Станции находятся три астронавта.
В данном руководстве мы рассмотрели работу с JSON в Golang.

Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»