В чём разница между json.Unmarshal и json.NewDecoder?

В языке программирования 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
  1. 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 или слайсы/мапы.