Срез и карта в JSON в Go
Срез при сборке становится массивом в квадратных скобках. Элементы идут в том же порядке, что и в срезе, а тип элементов задает вид каждой ячейки в тексте.
Карта с ключом типа строка становится объектом: каждая пара ключ и значение превращается в поле объекта. Ключи карты другого типа для этого формата не подходят без своего вида.
Запишем теги и счетчики в одной структуре:
package main
import (
"encoding/json"
"fmt"
)
type Data struct {
Tags []string `json:"tags"`
Meta map[string]int `json:"meta"`
}
func main() {
d := Data{
Tags: []string{"go", "json"},
Meta: map[string]int{"a": 1, "b": 2},
}
data, err := json.Marshal(d)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(string(data))
}
В тексте ключ "tags" ведет к
массиву строк, а "meta" к объекту
с числовыми значениями. Пустой срез
дает [], пустая карта {}.
Разбор заполняет срез и карту по тексту:
package main
import (
"encoding/json"
"fmt"
)
type Data struct {
Tags []string `json:"tags"`
Meta map[string]int `json:"meta"`
}
func main() {
text := []byte(`{"tags":["x"],"meta":{"k":5}}`)
var d Data
err := json.Unmarshal(text, &d)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(len(d.Tags), d.Meta["k"])
}
Дана структура:
type Pack struct {
IDs []int `json:"ids"`
}
Соберите текст для значения с одним
элементом 7 в срезе и выведите
его.
Дана строка:
text := []byte(`{"meta":{"x":1}}`)
Разберите текст в структуру Data
из урока и выведите значение по ключу
"x".
Дана структура:
type Bad struct {
ByInt map[int]string `json:"by_int"`
}
Скажите, соберется ли текст для заполненной карты без своего вида.