Poprawiłem ten program poprzez użycie Jacksona do importu plików i znacznie zredukowało to ilość linijek kodu 
Tylko weź pod uwagę co to znaczy. Owszem, linijek jest mniej, ale to dlatego że niejawnie nazwy pól i struktura formatu wejściowego musi być zbieżna z modelem Song. To się fachowo nazywa ciasne przywiązanie (tight-coupling), i ogólnie sprawia że aplikacja jest cięższa do zmiany. Nie jest to oczywiście jakaś tragedia, ale mimo wszystko pod względem elastyczności i jakości kodu to raczej krok wstecz. Prosty refaktor klasy Song może zepsuć działanie aplikacji, a zmiana formatu json'a w API które korzystasz wymusi albo przywrócenie poprzedniego kodu z czytaniem pól albo zmianę pól w klasie Song. Wiadomo, że mniej linijek wygląda czadersko, ale to raczej nie jest dobry kod.
Kod, który napisałem podzieliłem na klasy i metody. Czy taki podział jest odpowiedni?
Jeszcze raz wrzucam link: https://github.com/MaciekSm19/MusicChart
Klasa JsonDataImporter przyjmuje na wejściu adres URL a na wyjściu wystawia datę publikacji i listę piosenek. Nic w jej interfejsie nie mówi o JSON - JSON to szczegół implementacyjny. Skoro tak to w jej nazwie nie powinno być słowa JSON. Należałoby ją nazwać DataImporter, albo po prostu SongsImporter.
Wyjątek JsonProcessingException to szczegół implementacyjny, nie powinien być częścią sygnatury metody. Należałoby go złapać i rzucić runtime wyjątek catch (JsonProcessingException) { throw new RuntimeException(); }.
Klasa SongResponseFactory zasadzie nic nie robi - możnaby ją spokojnie usunąć.
Niepoprawne wczytanie danych widać że nie jest poprawnie obsłużone, bo nic nie robisz z wyjątkiem tylko System.out.prinln() - to nie jest dobry pomysł, bo zauważ ze jeśli poleci wyjątek, to jsonRoot pozostanie null, i obiekt będzie w niepoprawnym stanie. Późniejsze zawołanie getPublishDate() najpewniej poskutkuje NullPointerException, właśnie dlatego że konstruktor pozostawił obiekt w niepoprawnie zbudowanym stanie. Lepszym wyjściem byłoby po prostu rzucić wyjątek.
Zastanów się - jak program powinien się zachować, jeśli uruchomisz go nie mając połączenia z internetem?
Nie powinien się wywalić, powinien sprezentować odpowiedni wynik w interfejsie użytkownika, np. napisać tekst "Nie udało się wczytać listy piosenek".