В языке программирования Go библиотека "encoding/json" предлагает два способа для декодирования данных из формата JSON в структуры: json.Unmarshal и json.NewDecoder.
1. json.Unmarshal:
- Функция json.Unmarshal используется для декодирования JSON-данных в структуры Go или слайсы/мапы, переданные по указателю.
- Входные данные могут быть представлены в виде среза байтов ([]byte
) или строки (string
), содержащих кодированные данные JSON.
- Декодирование происходит через вызов функции синтаксиса json.Unmarshal(data []byte, v interface{})
, где data
- входные данные, а v
- указатель на структуру, в которую будут сохранены декодированные данные.
- Пример использования:
type Person struct { Name string `json:"name"` Age int `json:"age"` } data := []byte(`{"name":"John","age":30}`) var p Person err := json.Unmarshal(data, &p) if err != nil { panic(err) } fmt.Println(p.Name) // Выводит "John" fmt.Println(p.Age) // Выводит 30
2. json.NewDecoder:
- json.NewDecoder создает новый декодер, который может читать и декодировать JSON-данные из потока, такого как файл или сетевое соединение.
- json.NewDecoder требует источник данных (io.Reader
), который может быть передан в функцию json.NewDecoder(r io.Reader)
для создания декодера.
- Затем декодирование происходит через вызов метода Decode(v interface{})
на созданном декодере, где v
- указатель на структуру, в которую будут сохранены декодированные данные.
- Пример использования:
type Person struct { Name string `json:"name"` Age int `json:"age"` } file, err := os.Open("data.json") if err != nil { panic(err) } defer file.Close() var p Person decoder := json.NewDecoder(file) err := decoder.Decode(&p) if err != nil { panic(err) } fmt.Println(p.Name) // Выводит значение поля "name" fmt.Println(p.Age) // Выводит значение поля "age"
Разница между json.Unmarshal и json.NewDecoder заключается в том, что json.Unmarshal используется для декодирования JSON из форматов []byte
или string
, в то время как json.NewDecoder позволяет декодировать JSON из источника данных типа io.Reader
, такого как файл или сетевое соединение. json.Unmarshal прост и удобен для использования с небольшими данными, в то время как json.NewDecoder может быть полезным при работе с большими данными или когда необходима постепенная загрузка JSON-данных из источника. В обоих случаях декодированные данные сохраняются в указанные структуры Go или слайсы/мапы.