В данном руководстве будет показано, как работать с 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, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»