В чём разница между json.Unmarshal и json.NewDecoder?
json.Unmarshal использует массив байт, а json.NewDecoder это потоковый парсер, которому не нужно сразу хранить в памяти все данные для парсинга.

Для парсинга json из файла или из запроса, я бы советовал json.NewDecoder, так как он будет меньше потреблять памяти (не нужно заранее считывать в память массив байт).
json.NewDecoder используется при взаимодействии с API, а json.Unmarshal при работе с данными из памяти - например забрали массив данных с базы и потом обрабатываем его