Fiz exatamente igual na imersão java, porém, percebi que todo atributo json(no meu caso o "title") que tinha algo como ex: (The Godfather : Part II), ou seja, todo nome que tinha os ":" não gerava o arquivo png e só dá o nome até os ":". Como faço para resolver isso? segue em anexo as 3 classes e como fica o problema:
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.util.List;
import java.util.Map;
public class App {
public static void main(String[] args) throws Exception {
// fazer uma conexão HTTP e buscar os top 250 filmes
String url = "https://mocki.io/v1/9a7c1ca9-29b4-4eb3-8306-1adb9d159060";
URI endereco = URI.create(url);
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder(endereco).GET().build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
String body = response.body();
// extrair só os dados que interessam(titulo, poster, classificação)
JsonParser parser = new JsonParser();
List<Map<String, String>> listaDeFilmes = parser.parse(body);
// exibir e manipular os dados
var geradora = new GeradoraDeFigurinhas();
for (int i = 0; i < 10; i++) {
Map<String,String> filme = listaDeFilmes.get(i);
String urlImagem = filme.get("image")
.replaceAll("(@+)(.*).jpg$", "$1.jpg");
String titulo = filme.get("title");
InputStream inputStream = new URL(urlImagem).openStream();
String nomeDoArquivo = "saida/" + titulo + ".png";
geradora.cria(inputStream, nomeDoArquivo);
System.out.println(titulo);
System.out.println();
}
}
}
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import javax.imageio.ImageIO;
public class GeradoraDeFigurinhas {
public void cria(InputStream inputStream, String nomeArquivo) throws Exception {
// leitura da imagem
BufferedImage imagemOriginal = ImageIO.read(inputStream);
// cria nova imagem em memória com transparência e com tamanho novo
int largura = imagemOriginal.getWidth();
int altura = imagemOriginal.getHeight();
int novaAltura = altura + 200;
BufferedImage novaImagem = new BufferedImage(largura, novaAltura, BufferedImage.TRANSLUCENT);
// copiar a imagem original para novo imagem (em memória)
Graphics2D graphics = (Graphics2D) novaImagem.getGraphics();
graphics.drawImage(imagemOriginal, 0, 0, null);
// configurar a fonte
Font fonte = new Font(Font.SANS_SERIF, Font.BOLD, 80);
graphics.setColor(Color.YELLOW);
graphics.setFont(fonte);
// escrever uma frase na nova imagem
graphics.drawString("TOPZERA", 100, novaAltura - 100);
// escrever a nova imagem em um arquivo
ImageIO.write(novaImagem, "png", new File(nomeArquivo));
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JsonParser {
private static final Pattern REGEX_ITEMS = Pattern.compile(".*\\[(.+)\\].*");
private static final Pattern REGEX_ATRIBUTOS_JSON = Pattern.compile("\"(.+?)\":\"(.*?)\"");
public List<Map<String, String>> parse(String json) {
Matcher matcher = REGEX_ITEMS.matcher(json);
if (!matcher.find()) {
throw new IllegalArgumentException("Não encontrou items.");
}
String[] items = matcher.group(1).split("\\},\\{");
List<Map<String, String>> dados = new ArrayList<>();
for (String item : items) {
Map<String, String> atributosItem = new HashMap<>();
Matcher matcherAtributosJson = REGEX_ATRIBUTOS_JSON.matcher(item);
while (matcherAtributosJson.find()) {
String atributo = matcherAtributosJson.group(1);
String valor = matcherAtributosJson.group(2);
atributosItem.put(atributo, valor);
}
dados.add(atributosItem);
}
return dados;
}
}