Skip to content

Instantly share code, notes, and snippets.

@steppat
Last active October 10, 2023 13:13
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save steppat/2046285369b6c644b50d95a89277e2f5 to your computer and use it in GitHub Desktop.
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());
}
}
@christianomj
Copy link

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!).

@lucassilvaesmeraldino
Copy link

Sensacional! Deu até vergonha do código que eu escrevi aqui haha

@elvitin
Copy link

elvitin commented Jun 18, 2022

Professor, vc acabou comitando sua chave de API...

@Sana-Dev-X
Copy link

Sana-Dev-X commented Jun 24, 2022

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

@wagnerquadros
Copy link

Apanhei bastante na minha tentativa.. ... estudando a solução.

@Eder-TS
Copy link

Eder-TS commented Nov 25, 2022

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!

@ruan-narici
Copy link

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));
	}

}

@jonnathanweber
Copy link

jonnathanweber commented Jun 17, 2023

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