Разбор текста в структуру в Go
Текст кладут в переменную структуры по
ее адресу. Команда разбора из пакета
encoding/json принимает байты
и указатель на значение; без указателя
поля останутся пустыми.
Ошибку разбора проверяют так же, как при сборке: при неудаче структуру не считают заполненной. Лишние ключи в тексте обычно игнорируют, а известные поля заполняют по именам ключей или меткам.
Разберем готовый текст в пользователя:
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
text := []byte(`{"name":"ann","age":20}`)
var u User
err := json.Unmarshal(text, &u)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(u.Name, u.Age)
}
На экране "ann" и число 20.
Амперсand перед u передает адрес
переменной, куда пакет пишет поля.
Разбор можно повторить для карты со строковым ключом:
package main
import (
"encoding/json"
"fmt"
)
func main() {
text := []byte(`{"red":1,"blue":2}`)
m := make(map[string]int)
err := json.Unmarshal(text, &m)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(m["red"], m["blue"])
}
Дана строка:
text := []byte(`{"x":10,"y":20}`)
Объявите структуру с полями X
и Y и метками "x" и
"y", разберите text
и выведите оба числа.
Дана строка:
text := []byte(`{"title":"go"}`)
Разберите текст в структуру с полем
Title и меткой "title",
затем выведите поле.
Дан следующий фрагмент:
var u User
err := json.Unmarshal(text, u)
Скажите, почему поля после разбора останутся пустыми.