Вложенный объект в JSON в Go
Поле с типом структуры при сборке становится вложенным объектом. Ключ внешнего уровня берут из метки поля или из имени поля, а внутри лежат ключи вложенной структуры по тем же правилам.
При разборе текст объекта по ключу заполняет вложенную структуру целиком. Если внутренний объект опущен, поле остается нулевым значением типа.
Запишем человека с адресом:
package main
import (
"encoding/json"
"fmt"
)
type Address struct {
City string `json:"city"`
}
type Person struct {
Name string `json:"name"`
Addr Address `json:"address"`
}
func main() {
p := Person{
Name: "ann",
Addr: Address{City: "oslo"},
}
data, err := json.Marshal(p)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(string(data))
}
На экране объект с ключом "address"
и вложенным "city". Порядок ключей
в тексте может отличаться, смысл тот же.
Разберем тот же вид текста обратно:
package main
import (
"encoding/json"
"fmt"
)
type Address struct {
City string `json:"city"`
}
type Person struct {
Name string `json:"name"`
Addr Address `json:"address"`
}
func main() {
text := []byte(`{"name":"ann","address":{"city":"oslo"}}`)
var p Person
err := json.Unmarshal(text, &p)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(p.Addr.City)
}
Даны типы:
type Size struct {
W int `json:"w"`
H int `json:"h"`
}
type Box struct {
Label string `json:"label"`
Size Size `json:"size"`
}
Соберите текст для коробки с подписью
"a" и размером 2 на 3
и выведите его.
Дана строка:
text := []byte(`{"name":"bob","address":{"city":"berlin"}}`)
Используйте типы Person и
Address из урока, разберите
text и выведите город.
Дана структура:
type Outer struct {
Inner struct {
Val int `json:"val"`
} `json:"inner"`
}
Скажите, какой ключ появится у вложенного объекта в тексте.