Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Projeto Final Aprimorado.

Estou com um pequeno problema no meu codigo, eu acabei fazendo um projeto como se fosse um "endereçador"(Claro que precisei rever o video do projeto final e precisei copiar algumas coisas kkkk) , onde o usuario poderia colocar o nome da pessoa e telefone, segue abaixo:

public class Usuario extends FormularioEndereco{
    private String nome;
    private String telefone;


    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }


    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
}

public abstract class FormularioEndereco {

    private String complemento;
    private String cep;

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public String getCep(){
        return cep;
    }
    public void setCep(String cep){
        this.cep = cep;
    }
}

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        var dados = new Scanner(System.in);
        var usuario = new Usuario();

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();

        System.out.println("Digite seu nome.");
        System.out.print("Nome: ");
        usuario.setNome(dados.next());
        System.out.println();
        System.out.println("Digite seu telefone:");
        System.out.print("Telefone: ");
        usuario.setTelefone(dados.next());
        System.out.println();

        System.out.println("Digite seu CEP.");
        System.out.println("ATENÇÃO! Insira apenas numero!");
        System.out.print("CEP: ");
        usuario.setCep(dados.next());

        String endereco = "http://viacep.com.br/ws/" + usuario.getCep() + "/json";

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(endereco))
                .build();
        HttpResponse<String> response = null;
        try {
            response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());
                    response.body();

            System.out.println();
            System.out.println("nome: ''"+ usuario.getNome()+"''" );
            System.out.println("telefone: ''"+ usuario.getTelefone()+"''" );
            System.out.println(response.body());

            FileWriter escrita = new FileWriter(usuario.getNome()+".json");
            escrita.write(gson.toJson(response.body()));
            escrita.close();

        } catch (IOException | InterruptedException e) {
            throw new RuntimeException("Não foi possivel verificar CEP!");
        }
    }
}

Quando gera o json ele fica dessa forma as informações todas em uma linha:

"{\n  \"cep\": \"01001-000\",\n  \"logradouro\": \"Praça da Sé\",\n  \"complemento\": \"lado ímpar\",\n  \"bairro\": \"Sé\",\n  \"localidade\": \"São Paulo\",\n  \"uf\": \"SP\",\n  \"ibge\": \"3550308\",\n  \"gia\": \"1004\",\n  \"ddd\": \"11\",\n  \"siafi\": \"7107\"\n}"

Gostaria de saber como posso deixar de uma forma que cada informação fique em uma linha, e gostaria de saber como posso esta melhorando nesse codigo.

1 resposta
solução!

Fala aí, Daniel!

Parabéns por ter chegado até aí, praticar é muito importante e com certeza os seus erros e acertos vão te fazer reter esse conhecimento.

A sua gravação no arquivo está saindo assim porque o valor do request.body() já é um Json... Estamos lidando com uma API, ela sempre retorna tudo em Json, então não precisa tentar converter o objeto de retorno em um Json. Basta fazer assim:

    escrita.write(response.body());
    escrita.close();

Como melhoria pro seu código, eu vou te deixar dois questionamentos pra te ajudar a compreender melhor a orientação a objetos:

  • Se Usuario extende de FormularioEndereco, isso quer dizer que Usuario é um tipo de FormularioEndereco. Isso faz sentido pro contexto da aplicação?

  • Por que FormularioEndereco é uma classe abstrata? O que ela faz sendo abstrata que não daria pra fazer sendo uma classe normal?

Bons estudos, meu mano!