JSON (JavaScript Object Notation) е много гъвкав и изключително популярен формат на данни. Често се използва за комуникация между уеб приложения, а също и като удобен начин за съхраняване на големи количества структурирани данни за приложения.
JSON е толкова полезен, че почти всички съвременни езици за програмиране предоставят вградена поддръжка за работа с него, включително Go.
Работа с JSON в Go
Можете да разделите по-голямата част от работата, която ще вършите с JSON, в две общи категории: маршалинг и демаршалинг. Уикипедия дефинира маршалинга като:
В компютърните науки маршалингът е процес на трансформиране на представянето на паметта на обект във формат на данни, подходящ за съхранение или предаване. Обикновено се използва, когато данните трябва да се преместват между различни части на компютърна програма или от една програма в друга.
С по-прости думи маршалингът е процес на преобразуване на данни, съхранени в променлива, във форма, която е по-лесна за предаване към друга програма. Демаршалингът е обратният процес: той включва вземане на данни, форматирани за транспортиране, и преобразуването им във форма, която е по-лесна за използване от вашата програма.
Използвайки Go, можете да маршалирате естествени структури от данни в JSON. И можете да извършите обратното действие, демаршалинг на JSON данни в Go променливи.
Маршалинг към JSON в Go
Go осигурява кодиране/json пакет за да ви улесни работата с JSON. Този пакет съдържа няколко функции, но тази, която ще използвате за маршалинг, е маршал функция. маршал има следния функционален подпис:
func Marshal (v интерфейс{}) ([]байт, грешка)
Това означава, че маршал приема параметър от произволен тип данни и връща две стойности: част от байтове и грешка. С други думи, вие се обаждате маршал със стойност Go и го преобразува в JSON и връща JSON еквивалента. Ако срещне грешка по време на процеса на преобразуване, ще върне грешката и празен срез.
Ето примерен код, който използва маршал за конвертиране на карта в JSON. За да стартирате този пример, всичко, от което се нуждаете, е да създадете Go файл в вашият любим редактор на кодове, или използвайте Отидете на детска площадка:
пакет основен
импортиране (
"кодиране/json"
"fmt"
)функ основен(){
val := карта [низ]вътр{
"Джон": 25,
"Дева Мария": 19,
"Адам": 5,
}
res, _ := json. маршал (вал)
fmt.Println(низ(рез))
}
Ако стартирате този код, той ще изведе следното:
Както споменахме по-рано, можете да маршалирате всеки тип Go данни в JSON, въпреки че в реалния живот обикновено ще маршалирате структури. Поради това Go предоставя функция, наречена struct tags, която ви позволява да давате маршал допълнителни инструкции за конвертиране на вашите структури.
Тагът на структура е низ, който включвате във вашата декларация на структура до типа данни на поле. Структурните маркери ви позволяват да коригирате начина маршал третира полето, към което принадлежи етикетът. Можете да използвате struct тагове, за да преименувате поле в JSON изхода или дори да го пропуснете изцяло. Структурни тагове (това маршал разпознава) започва с подниза "json:".
Като пример, кажете, че имате структура Кола който представлява някаква информация за автомобил. Ето кода за създаване на Кола и го маршалирайте в JSON:
пакет основен
импортиране (
"кодиране/json"
"fmt"
)
функ основен(){
Тип Конструкция на кола {
Марков низ
Модел низ
Цена вътр
}
val := Car{Марка: "Мерцедес", Модел: "Benz", Цена: 50000}
res, _ := json. маршал (вал)
fmt.Println(низ(рез))
}
Този код произвежда резултата:
The Марка, Модел, и Цена полета на Кола трябва да започва с главни букви, или маршал няма да можете да ги конвертирате. Това води до това, че изходните полета на JSON също започват с главни букви. Но какво ще стане, ако искате имената да започват с малки букви в JSON или ако искате изцяло да преименувате поле? Това е мястото, където влизат таговете struct. Ето един пример:
пакет основен
импортиране (
"кодиране/json"
"fmt"
)
функ основен(){
Тип Конструкция на кола {
ID int `json:"-"`
Марков низ `json:"Тип"`
Моделен низ `json:"модел"`
Цена в `json:"цена"`
}
val := Car{ID: 0, Марка: "Мерцедес", Модел: "Benz", Цена: 50000}
res, _ := json. маршал (вал)
fmt.Println(низ(рез))
}
Този код въвежда ново ID поле, което маршал пропуска от JSON изхода чрез маркер struct. Кодът също така използва структурни тагове за преименуване на другите структурни полета. Ето изхода от програмата:
Както можете да видите, частта от маркера struct след "json:" става името на полето в изхода на Marshal. Има едно изключение: ако това е низът "-", Marshal пропуска това поле от изхода. Можете да прочетете повече за етикетите Marshal и struct в Отидете на документация.
Демаршалинг от JSON в Go
Пакетът encoding/json предоставя и функция за демаршалинг, наречена Unmarshal. Той има следния функционален подпис:
func Unmarshal (данни []байт, v интерфейс{}) грешка
За разлика от маршал, Unmarshal не връща стойност. Вместо това той приема JSON като част от байтове в първия аргумент и след това съхранява преобразуваните данни в обекта, към който сочи вторият му аргумент. Unmarshal работи и със struct тагове, но тук таговете казват Unmarshal кои JSON полета съответстват на кои структурни полета.
При демаршалинг в програма може да извличане на данни от API, но тук ще използвате фиктивни данни. Ето как да използвате Unmarshal:
пакет основен
импортиране (
"кодиране/json"
"fmt"
)функ основен(){
Тип Конструкция на кола {
ID int `json:"-"`
Марков низ `json:"Тип"`
Моделен низ `json:"модел"`
Цена в `json:"цена"`
}jsonInput := `{
"Тип": "Тойота",
"модел": "Камри",
"цена": 2000
}`вар jsonOutput Car
грешка := json. Демаршал([]байт(jsonInput), &jsonOutput)if err != nil {
fmt. Println("Грешка при декодиране на JSON!")
връщане
}
fmt.Println(jsonOutput)
}
Този код използва същия тип Car като предишния пример и демаршалира JSON обект в структура от тип Car, след което отпечатва данните в структурата. Когато се стартира, програмата произвежда този резултат:
Това показва, че фиктивните JSON данни са успешно демаршалирани в jsonOutput структура
Go улеснява работата с JSON
С пакета encoding/json работата с JSON в Go е толкова проста, колкото две извиквания на функции: Marshaland Unmarshal. Go също ви позволява да персонализирате процеса на маршалинг/демаршалинг на JSON със struct тагове.
Преобразуването на данни в JSON е чудесен начин за споделянето им с друга програма или процес. Форматът е толкова универсален, че JSON е възможно най-преносим.