Зачем json считывать через Scanner?
Зачем считывать файл через Scanner?

С помощью класса Scanner вы можете читать данные из файла точно так же, как и с помощью BufferedReader'а, BufferedInputStream'а и других классов, способных читать файловые данные. Почему же здесь использовали Scanner известно только тому, кто написал этот класс, потому что есть более подходящие классы для подобных операций.

Зачем использовать цикл? нельзя взять и всю прочитать без цикла?

Поскольку это универесальный класс и в реальной рабочей ситуации вы бы не знали, файлы какого размера будут читать с помощью этого метода, гораздо лучше использовать циклы и читать файл построчно. Вы можете прочитать файл целиком, но на больших файлах это будет работать ужасно медленно.

Зачем строке происваевать данные файла?

В переменной fromJson мы сохраняем прочитанные данные, а поскольку JSON представляет собой обычный набор текста, то использование типа String более чем подходит для этой операции. Вы также можете использовать коллекции или массивы для этого.

Зачем указывать тип объекта в конце?

Метод fromJson десериализует JSON, прочитанный из Reader'а (в данном случае из строки) в объект класса, указанного вторым аргументом.
Ссылочка на спек класса
https://www.javadoc.io/doc/com.google.code.gson/gs...
JSON - это просто текст. И чтение JSON ничем не отличается от чтения любого текстового файла.
Использование Scanner - один из способов чтения текстового файла. В данном случае, далеко не лучший способ.
Например, здесь https://javadevblog.com/kak-schitat-fajl-v-string-... показаны 4 разных способа прочитать текстовый файл в String-переменную.