Solucionado (ver solução)
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ç