Last active
October 10, 2023 13:13
-
-
Save steppat/2046285369b6c644b50d95a89277e2f5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} |
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 );
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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");
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!