Ok, però ti segnalo che non servirebbe andare ad usare JsonArray, JsonElement, ecc...

C'è un modo molto più semplice e pulito: sfruttare un "type token".

codice:
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class ProvaBooksGson {
    public static void main(String[] args) {
        TypeToken<List<Book>> booksListToken = new TypeToken<List<Book>>() {};

        Gson gson = new Gson();
        List<Book> booksList = gson.fromJson("[{\"title\":\"One\"},{\"title\":\"Two\"}]", booksListToken.getType());

        System.out.println(booksList);
    }
}

class Book {
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String toString() {
        return "Book:" + getTitle();
    }
}