Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Erro no retorno de Strings com espaços

Boa tarde a todos,

Estou desenvolvendo um aplicação aqui na empresa, para que os nossos associados tenham o cartão de associado em seus dispositivos Android, por enquanto, montei um webservice com REST para consulta dos dados no banco e que me retorna o conteúdo em JSON. Quando o campo com o nome do associado é retornado, o log do ADS informa que não conseguiu finalizar a construção da String e para no espaço entre o nome e o Sobre nome. Alguém aqui do fórum poderia me ajudar. Seguem dados para auxílio.

Desde já, agradeço o apoio.

JSON:

{
   "associado": {
      "dataInicio": "2004-08-10T00:00:00-03:00",
      "dataNascimento": "1982-09-01T00:00:00-03:00",
      "matricula": 2,
      "sequencia": 2,
      "status": "Cancelado"
   }
}

AssociadoConverter (Classe criada para converter o retorno em Objeto):

public class AssociadoConverter {

    public Cartao converteParaAssociado(String associado) {

        try {
            JSONObject obj = new JSONObject(associado);
            JSONObject object = obj.getJSONObject("associado");
            String matricula = object.getString("matricula");
            Integer sequencia = object.getInt("sequencia");
            String nome = object.getString("nome");
            String status = object.getString("status");
            Calendar dataNascimento = converteEmCalendar(object.getString("dataNascimento"));
            Calendar dataInicio = converteEmCalendar(object.getString("dataInicio"));

            Cartao cartao = new Cartao();
            cartao.setProposta(matricula);
            cartao.setNome(nome);
            cartao.setSequencia(sequencia);
            cartao.setDataNascimento(dataNascimento);
            cartao.setDataInicio(dataInicio);
            cartao.setStatus(status);

            return cartao;

        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    private Calendar converteEmCalendar(String valor) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            Date data = sdf.parse(valor);
            Calendar cal = Calendar.getInstance();
            cal.setTime(data);
            return cal;
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return null;
    }
}
10 respostas

Oi Rafael tudo bem?

Não manjo muito de Android mas não tá faltando a propriedade nome no objeto json ? Não é esse erro que dá no console?

Espero ter ajudado!!!

Bom dia André,

É que colei o código para testar se o problema era o nome e era mesmo. Por isto está sem. Vou colar o JSON correto:

{
   "associado": {
      "dataInicio": "2004-08-10T00:00:00-03:00",
      "dataNascimento": "1982-09-01T00:00:00-03:00",
      "matricula": 2,
      "nome": "RAFAEL PEREIRA SANTOS",
      "sequencia": 2,
      "status": "Cancelado"
   }
}

Identifiquei que se na passagem do nome eu substitui os espaços por "-", funciona normalmente.

"nome": "RAFAEL-PEREIRA-SANTOS"

Alguém sabe me informar se tem um formar de contornar esta limitação?

Ola, tudo bom Rafael

O seu Json esta correto, não é necessário substitui os espaços por "-", se fizer um teste passando uma String com este Json, para o seu método, vai ver que funciona.

Como você esta fazendo as requisições para sua API, esta usando alguma lib para isto?

Você pode postar o seu código, fica mais fácil para identificar o problema

Ahh esqueci

O pattern que esta usando para as datas, esta incorreto, segue um que acredito funcionar para o seu caso.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");

Bom dia Alessandro,

O pattern eu já havia corrido, obrigado!

Segue baixo a classe que é responsável por realizar a coleta das informações no webservice.

public class WebClient {
    public String get(String matricula, String dataNascimento) {
        try {
            StringBuilder pagina = new StringBuilder();
            pagina.append("http://10.67.1.2:8080/VidaCarteirinha/jaxrs/associado");
            pagina.append("?matricula="+matricula);
            pagina.append("&dataNascimento="+dataNascimento);
            URL url = new URL(pagina.toString());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Accept","application/json");

            Scanner scanner = new Scanner(connection.getInputStream());
            if (scanner.hasNext()) {
                return scanner.next();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
solução!

Ola Rafael

Neste trecho de código, você verifica se existe uma próxima linha a ser lida, e imediatamente retorna o próximo texto encontrado

Scanner scanner = new Scanner(connection.getInputStream());
    if (scanner.hasNext()) {
        return scanner.next();
    }

O problema é que, você não terminou de percorrer todas as linhas do json, pois seu condicional verifica apenas uma vez, se existe um próximo texto a ser lido. Então se fizesse a seguinte alteração, você passaria a verificar todas as linhas

String result = null;
Scanner scanner = new Scanner(connection.getInputStream());
    while (scanner.hasNext()) {
        result += scanner.next();
    }
return result;

Mas ainda existe um problema, o scanner.next(), lê a String até o primeiro espaço, com isto, o nome do usuário não teria espaços. Como solução, você poderia utilizar o método scanner.nextLine(), que faz a leitura até encontrar uma quebra de linha.

String result = null;
while (scanner.hasNext()) {
    sb.append(scanner.nextLine());
    result += scanner.nextLine();
}

Faça estas alterações e responde aqui se funcionou

Não entrei em mais detalhes na resposta, para ser o mais sucinto possível, e tentei solucionar apenas a dúvida que abriu. Mas gostaria de te recomendar 3 cursos da Alura, tenho certeza que esses cursos te ajudariam muito do desenvolvimento do seu projeto.

Android com Web Service parte 1: Sincronize sua app com o servidor

Android com Web Service parte 2: mais técnicas de sincronização

Android com Web Service parte 3: sincronização em modo offline

Boa tarde Alessandro,

Muito obrigado pela ajuda, a solução que você apresentou, resolveu o problema que estava tendo.

Estou fazer a formação "Desenvolvedor Android", terminei a primeira etapa e estou usando a necessidade de desenvolver um app relativamente simples para empresa, aplicando o conhecimento aprendido na primeira etapa do curso. Por isto não farei o de Android com Web Service ainda, prefiro seguir as etapas.

Obrigado pela ajuda e pela dica do curso.

Com certeza Rafael

Se esta fazendo a formação, siga a ordem,é a melhor escolha

Boa sorte e abç