-
-
Save steppat/2046285369b6c644b50d95a89277e2f5 to your computer and use it in GitHub Desktop.
import java.net.URI; | |
import java.net.http.HttpClient; | |
import java.net.http.HttpRequest; | |
import java.net.http.HttpResponse; | |
import java.util.List; | |
import java.util.regex.Matcher; | |
import java.util.regex.Pattern; | |
import java.util.stream.Collectors; | |
import java.util.stream.Stream; | |
class SevenDaysOfCodeJavaDay2 { | |
public static void main(String[] args) throws Exception { | |
String apiKey = "<sua chave>"; | |
URI apiIMDB = URI.create("https://imdb-api.com/en/API/Top250TVs/" + apiKey); | |
HttpClient client = HttpClient.newHttpClient(); | |
HttpRequest request = HttpRequest.newBuilder().uri(apiIMDB).build(); | |
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); | |
String json = response.body(); | |
String[] moviesArray = parseJsonMovies(json); | |
List<String> titles = parseTitles(moviesArray); | |
titles.forEach(System.out::println); | |
List<String> urlImages = parseUrlImages(moviesArray); | |
urlImages.forEach(System.out::println); | |
//outras listas para rating e years | |
} | |
private static String[] parseJsonMovies(String json) { | |
Matcher matcher = Pattern.compile(".*\\[(.*)\\].*").matcher(json); | |
if (!matcher.matches()) { | |
throw new IllegalArgumentException("no match in " + json); | |
} | |
String[] moviesArray = matcher.group(1).split("\\},\\{"); | |
moviesArray[0] = moviesArray[0].substring(1); | |
int last = moviesArray.length - 1; | |
String lastString = moviesArray[last]; | |
moviesArray[last] = lastString.substring(0, lastString.length() - 1); | |
return moviesArray; | |
} | |
private static List<String> parseTitles(String[] moviesArray) { | |
return parseAttribute(moviesArray, 3); | |
} | |
private static List<String> parseUrlImages(String[] moviesArray) { | |
return parseAttribute(moviesArray, 5); | |
} | |
private static List<String> parseAttribute(String[] moviesArray, int pos) { | |
return Stream.of(moviesArray) | |
.map(e -> e.split("\",\"")[pos]) | |
.map(e -> e.split(":\"")[1]) | |
.map(e -> e.replaceAll("\"", "")) | |
.collect(Collectors.toList()); | |
} | |
} |
Sensacional! Deu até vergonha do código que eu escrevi aqui haha
Professor, vc acabou comitando sua chave de API...
Muito bom, professor Nico! Eu também estou desenvolvendo o meu e peguei um pouco da referencia daqui para refatorar o meu código, porém na outra parte que faz quase a mesma coisa para parsear, eu deixei do meu jeito mesmo para ver meu avanço.
Está dentro da branch master.
https://github.com/Sana-Dev-X/7DaysOfCode-Sana.git
Apanhei bastante na minha tentativa.. ... estudando a solução.
Boa tarde, galera! Meu código não chega no nível do pessoal aí de cima que tem até HTML e OO bem aplicada! Mas fico feliz de conseguir ler as informações do jeisão (JSon), separar o que interessa e imprimir no console.
O quê pegou é que não consegui separar o imDbRating do ImDbRatingCount com regex! Vou deixar abaixo o código da parte que extrai as informações.
` // Busca na String pela url da imagem
Pattern patternInicioUrlImagem = Pattern.compile("https");
Pattern patternFimUrlImagem = Pattern.compile("jpg");
Matcher matcherInicioUrlImagem = patternInicioUrlImagem.matcher(string);
Matcher matcherFimUrlImagem = patternFimUrlImagem.matcher(string);
List<String> imagens = new ArrayList<>();
while (matcherInicioUrlImagem.find() && matcherFimUrlImagem.find()) {
String urlImagem = string.substring(matcherInicioUrlImagem.start() + 3, matcherFimUrlImagem.start() - 3);
imagens.add(urlImagem);
// System.out.println(urlImagem);
}
// Busca na String por ano
Pattern patternAno = Pattern.compile("year");
Matcher matcherAno = patternAno.matcher(string);
List<String> anos = new ArrayList<>();
while (matcherAno.find()) {
String ano = string.substring(matcherAno.end() + 3, matcherAno.end() + 7);
anos.add(ano);
// System.out.println(ano);
}
//Busca na String por imDbRating
//Aqui não funcionou pois existe imDbRating e imDbRatingCount
//Não consegui faer funcionar a regex no Pattern.compile("imDbRating");
Pattern patternImdbRating = Pattern.compile("imDbRating");
Matcher matcherImdbRating = patternImdbRating.matcher(string);
List<String> classificacao = new ArrayList<>();
while (matcherImdbRating.find()) {
String rating = string.substring(matcherImdbRating.end() + 3, matcherImdbRating.end() + 6);
classificacao.add(rating);
System.out.println(rating);
}`
No Pattern.compile eu entendi que deveria escrever "imDbRating\b" para excluir imDbRatingCount, mas não funcionou. Então, se eu levar este código a diante, vou fazer um tratamento neste último while para não adicionar imDbRatingCount no array.
Abraço a todos e sucesso!
Bom dia galera!
Rapaz, que desafio complicado.
Como eu já havia tentado várias vezes, a minha alternativa foi salvar o arquivo .json no computador e fazer a leitura dele.
O IMDB só permite 100 requisições por dia, e eu fiz bem mais que isso até conseguir kkk.
Este desafio superou todos os meus conhecimentos.
EU GOSTO ASSIM!!! MAIS APRENDIZADO PRA CONTA DO PAI !! :D
- Meu código ficou assim:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class getJsonIMDB {
public static void main(String[] args) throws Exception {
//Criei esta variavel para facilitar a navegacao entre os elementos.
int rank = 3;
FileInputStream fis = new FileInputStream("Top250Movies.json");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String ler = br.readLine();
String saveJson = ler;
while(ler != null) {
ler = br.readLine();
saveJson += ler;
}
br.close();
String[] listaFilmes = saveJson.split("},");
String[] listaAtributos;
List<String> listaTitulo = new ArrayList<>();
List<String> listaImagem = new ArrayList<>();
System.out.println(listaFilmes[rank]);
for (int i = 0; i < listaFilmes.length; i++) {
listaAtributos = listaFilmes[i].split(",");
listaTitulo.add(listaAtributos[2]);
listaImagem.add(listaAtributos[5]);
}
System.out.println(System.lineSeparator() + "GET attributes from JSON:");
System.out.println(listaTitulo.get(rank));
System.out.println(listaImagem.get(rank));
}
}
fiz assim
public static void main( String[] args ) {
String returnJSON;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().
uri(URI.create("https://imdb-api.com/en/API/Top250Movies/k_37jkhozm")).
build();
returnJSON = client.sendAsync(request, BodyHandlers.ofString()).
thenApply(HttpResponse::body).
join();
JSONArray jsonFilmes = new JSONObject(returnJSON).getJSONArray("items");
ArrayList<String> titulo = new ArrayList<>();
ArrayList<String> imagem = new ArrayList<>();
ArrayList<String> ano = new ArrayList<>();
ArrayList<String> nota = new ArrayList<>();
for (Object a : jsonFilmes) {
titulo.add( ((JSONObject) a).getString("title") );
imagem.add( ((JSONObject) a).getString("image") );
ano.add( ((JSONObject) a).getString("year") );
nota.add( ((JSONObject) a).getString("imDbRating") );
}
System.out.println( titulo );
}
Eh, Professor/Alemão Favorito,
Vou levar um tempo para entender a solução.
A minha ficou bem diferente, mas funktionou... (pelo menos na minha máquina hehe!).