Retirar quebra de linha de JSON

20 respostas Resolvido
R

Bom dia pessoal.

Tenho um webservice em php que faz uma consulta ao banco de dados e retorna um JSON para o android consumir.

Quando tem algum campo no bd com espaço em branco, ele dá erro no android.

Quando todos os campos do bd estão sem espaço em branco, o android pega o json normal.

Alguém já se deparou com isso? Um amigo me falou que poderia ser quebra de linha do json, mas eu não acredito. De qualquer jeito, como retiraria as quebras de linha do json antes de retorná-lo ao android?

Obrigado.

20 Respostas

peczenyj

não faz muito sentido isso, realmente. mostra um exemplo do json.

o que vc pode fazer é validar o mesmo com alguma ferramenta

R

Obrigado pela ajuda.

Seguinte, eu faço uma consulta no bd, pegandos os Estados.

Então eu gero um JSON, que é o seguinte:

{"estados":[{"id":"2","nome":"Minas Gerais"},{"id":"1","nome":"Rio de Janeiro"}]}

Ai quando o android pega esse JSON, ele dá erro. Agora se eu enviar o seguinte JSON:

{"estados":[{"id":"2","nome":"Minas_Gerais"},{"id":"1","nome":"Rio_de_Janeiro"}]}

Ai o android pega o json, usa e não da nenhum erro.

Entendeu? Não sei se consegui explicar exatamente o que está acontecendo.

R

Validei no site que vc me passou, ele retornou JSON Válido.

peczenyj

que erro ele apresenta?

R

org.json.JSONException: Unterminated string at character 35 of {"estados":[{"id":"2","nome":"Minas

Dragoon

Poste o código referente a esse erro!?

R
try 
{
        JSONObject json = new JSONObject(resposta);
        JSONArray estadosJSONArray = json.getJSONArray("estados");
        List<String> estadosArray = new ArrayList();

        for (int i = 0; i < estadosJSONArray.length(); i++) {
            JSONObject estado = estadosJSONArray.getJSONObject(i);
            String nomeDoEstado = estado.getString("nome");

            estadosArray.add(nomeDoEstado);
        }
        fragmentCom.populaSpinner(estadosArray);

} 
catch (JSONException e) 
{
        e.printStackTrace();
        Toast.makeText(fragmentCom.getContext(), 
              "Erro ao carregar spinner..", Toast.LENGTH_SHORT).show();
}
peczenyj

cara estados não parece ser um jsonArray e sim um jsonObject

Dragoon

Eu fiz o teste assim e funcionou de primeira!:

String resposta = "{\"estados\":[{\"id\":\"2\",\"nome\":\"Minas Gerais\"},{\"id\":\"1\",\"nome\":\"Rio de Janeiro\"}]}";
JSONObject json = new JSONObject(resposta);
JSONArray estadosJSONArray = json.getJSONArray("estados");
List<String> estadosArray = new ArrayList();

for (int i = 0; i < estadosJSONArray.length(); i++) {
    JSONObject estado = estadosJSONArray.getJSONObject(i);
    String nomeDoEstado = estado.getString("nome");
    estadosArray.add(nomeDoEstado);
    System.out.println(nomeDoEstado);
}
R

Realmente, fiz o mesmo teste e funcionou.

O interessante que quando abro a página em php em meu navegador, ela me devolve a resposta:
{"estados":[{"id":"2","nome":"Minas Gerais"},{"id":"1","nome":"Rio de Janeiro"}]}

E a string de teste que dá certo é:
"{\"estados\":[{\"id\":\"2\",\"nome\":\"Minas Gerais\"},{\"id\":\"1\",\"nome\":\"Rio de Janeiro\"}]}"

Pelo que pude perceber, é a mesma coisa. Onde posso estar errando então?

Dragoon

E o caracter de escape por isso o meu funcionou e o seu não

Leia:

R

Desculpe Dragoon, não entendi.

Quando eu fiz o mesmo teste que você, utilizando a string para preencher meu spinner, ele funcionou.

Mas quando eu pego o json recebido, daí não funciona.

Também não entendi essa questão do caracter de escape.

Dragoon

Quando você recebe ele vem dentro de uma String?
Como você recupera me dá o exemplo de código faço o teste pra você?

R

Função que chama a conexão e recebe o JSON:

protected String doInBackground(Void... params) {

        WebClientBuscaEstados client = new WebClientBuscaEstados();
        String resposta = client.post();

        return resposta;
}

E a classe WebClientBuscaEstados:

public class WebClientBuscaEstados {
    public String post(){
        String pagina = Constants.URL_SITE+ "/buscaEstados.php";

        try{
            URL url = new URL(pagina);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestProperty("Content-type", "application/json"); 
            connection.setRequestProperty("Accept", "application/json"); 

            connection.setDoOutput(true);
            PrintStream output = new PrintStream(connection.getOutputStream());
            output.println();
            connection.connect();
            String jResposta = new Scanner(connection.getInputStream()).next();

            return jResposta;

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

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
Dragoon

Tem essa classe de utilidades que você deve usar depois que recebe o resultado:

Exemplo: http://www.avajava.com/tutorials/lessons/how-do-i-escape-a-string-for-java.html

API: https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html

Download

http://www.java2s.com/Code/Jar/a/Downloadapachecommonslangjar.htm
https://commons.apache.org/proper/commons-lang/download_lang.cgi

Dragoon

Aqui tem um exemplos e os links referentes! @R_a_f_a_e_ll

R

Eu acessei tudo que vc mandou…

Não consegui…

Seria basicamente usar a biblioteca StringEscapeUtils e usar uma função para converter meu json retirando os caracteres de escape? Seria isso?

Dragoon

Seguinte eu precisa receber esse json aqui no meu netbeans tem como! ?

R

Desculpa Dragoon, não entendi sua pergunta.

R
Solucao aceita

Consegui resolver da seguinte maneira:

Quando recebia a resposta do webservice, colocava em um String recebendo um Scanner.

String jResposta = new Scanner(connection.getInputStream()).next();

Apenas recebi a dica de mudar esse Scanner, passando para ele qual seria o meu limite final de arquivo, “\n”.

Scanner jResposta = new Scanner(connection.getInputStream()).useDelimiter("\n");
String resposta = jResposta.next();
Criado 27 de outubro de 2016
Ultima resposta 3 de nov. de 2016
Respostas 20
Participantes 3