1

I am newer to Java/Android and I am trying to create a class to query basic rest json from url https://viacep.com.br/ws/69050110/json/ and the json return is:

{ "cep": "69050-110", "logradouro": "Conjunto Tocantins", "complemento": "", "bairro": "Chapada", "localidade": "Manaus", "uf": "AM", "unidade": "", "ibge": "1302603", "gia": "" }

My code in eclipse neon is

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ViaCEP_WebService;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.net.ssl.HttpsURLConnection;

import org.codehaus.jackson.annotate.JsonPropertyOrder;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

/**
 *
 * @author marcelosiedler
 */
public class HttpExemplo2 {

    private final String USER_AGENT = "Mozilla/5.0";

    public static void main(String[] args) throws Exception {

        HttpExemplo2 http = new HttpExemplo2();
    //http.sendGet();

        System.out.println("Testing 1 - Send Http GET request");
        String WSChamada;
        String tipo;
        String cep;
        int array = 5;

        //WSChamada = "http://192.168.0.245:8080/datasnap/rest/TContatoController/ParcelaS/BRAA-007809-004";

        tipo = "json";
        cep = "69050110";

        WSChamada = "http://viacep.com.br/ws/"+cep+"/"+tipo;

        String json = http.sendGet(WSChamada);


        System.out.println(json); // imprimme padrão 

        // criando array de json para gson para impresão
        Gson g = new Gson();
        ConsultaWSCep c = new ConsultaWSCep();

        Type ceptype = new TypeToken<List<ConsultaWSCep>>() {}.getType();
        List<ConsultaWSCep> list = g.fromJson(WSChamada, ceptype);

        System.out.println(c.getCep());

        //c = g.fromJson(json, ConsultaWSCep);

        //System.out.println(c.getCep());

        //System.out.println("\nTesting 2 - Send Http POST request");
        //http.sendPost();

    }


    // HTTP GET request
    private String sendGet(String url) throws Exception {


        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        // optional default is GET
        con.setRequestMethod("GET");

        //add request header
        con.setRequestProperty("User-Agent", USER_AGENT);

        int responseCode = con.getResponseCode();
        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        //print result
        //System.out.println(response.toString());
        return response.toString();
    }

    // HTTP POST request
    private void sendPost() throws Exception {

        String url = "https://selfsolve.apple.com/wcResults.do";
        URL obj = new URL(url);
        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

        //add reuqest header
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");

        String urlParameters = "sn=C02G8416DRJM&cn=&locale=&caller=&num=12345";

        // Send post request
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();

        int responseCode = con.getResponseCode();
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + urlParameters);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        //print result
        System.out.println(response.toString());

    }

}

but it returns an error to me:

Testing 1 - Send Http GET request

Sending 'GET' request to URL : http://viacep.com.br/ws/69050110/json
Response Code : 200
{  "cep": "69050-110",  "logradouro": "Conjunto Tocantins",  "complemento": "",  "bairro": "Chapada",  "localidade": "Manaus",  "uf": "AM",  "unidade": "",  "ibge": "1302603",  "gia": ""}
Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 5
    at com.google.gson.Gson.fromJson(Gson.java:806)
    at com.google.gson.Gson.fromJson(Gson.java:761)
    at com.google.gson.Gson.fromJson(Gson.java:710)
    at ViaCEP_WebService.HttpExemplo2.main(HttpExemplo2.java:61)
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 5
    at com.google.gson.stream.JsonReader.expect(JsonReader.java:339)
    at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:306)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:79)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
    at com.google.gson.Gson.fromJson(Gson.java:795)
    ... 3 more

I want to get the objects like cep, logadouro, complemento etc.

Any help ?

Best Anderson

ajb
  • 31,309
  • 3
  • 58
  • 84
Anderson Muniz
  • 33
  • 1
  • 1
  • 7

1 Answers1

0

You are asking Gson to build a List of ConsultaWSCep, however your JSON only contains a single object.

Replacing this:

Type ceptype = new TypeToken<List<ConsultaWSCep>>() {}.getType();
List<ConsultaWSCep> list = g.fromJson(WSChamada, ceptype);

With:

ConsultaWSCep consultaWSCep = g.fromJson(WSChamada, ConsultaWSCep.class);

will give you the single instance of your class (presumably your JSON does match your class, but since you didn't include the class in your question it's hard to tell.

Alternatively, change your server code so it returns an array instead of single object. You could test this by hard coding your json:

String json = "[{  \"cep\": \"69050-110\",  \"logradouro\": \"Conjunto Tocantins\",  \"complemento\": \"\",  \"bairro\": \"Chapada\",  \"localidade\": \"Manaus\",  \"uf\": \"AM\",  \"unidade\": \"\",  \"ibge\": \"1302603\",  \"gia\": \"\"}]";

More complete example:

String json = http.sendGet(WSChamada);
System.out.println(json); // imprimme padrão 
// criando array de json para gson para impresão
Gson g = new Gson();
ConsultaWSCep c = g.fromJson(WSChamada, ConsultaWSCep.class);
System.out.println(c.getCep());

Or:

ConsultaWSCep c = (new Gson()).fromJson(http.sendGet(WSChamada), ConsultaWSCep.class);
System.out.println(c.getCep());
Tibrogargan
  • 4,508
  • 3
  • 19
  • 38
  • package ViaCEP_WebService; public class ConsultaWSCep { private String cep; private String logradouro; private String complemento; private String bairro; private String localidade; private String uf; private String unidade; private String ibge; private String gia; all have get and set. (the class is too long to post) – Anderson Muniz Sep 12 '16 at 01:14
  • I changed the line you mentioned the result is: ConsultaWSCep consultaWSCep = g.fromJson(WSChamada, ConsultaWSCep.class) ==> Expected BEGIN_OBJECT but was STRING at line 1 column 5 but if I change the line to ConsultaWSCep consultaWSCep = g.fromJson(json, ConsultaWSCep.class) I get the result Testing 1 - Send Http GET request { "cep": "69050-110", "logradouro": "Conjunto Tocantins", "complemento": "", "bairro": "Chapada", "localidade": "Manaus", "uf": "AM", "unidade": "", "ibge": "1302603", "gia": ""} null – Anderson Muniz Sep 12 '16 at 01:18
  • @AndersonMuniz Put code in your question, not in comments please. I reproduced the issue with different data, I don't particularly need to see your code to give you a solution - however if your JSON does not match your class, you will continue to get JsonSyntaxError or JsonParseError until it does – Tibrogargan Sep 12 '16 at 01:18
  • The `c` object you create never gets used, of course it's null. Get rid of `c` and print data from the result of `g.fromJson` – Tibrogargan Sep 12 '16 at 01:21
  • This rest json is public and not my and I can't change anything just use it. – Anderson Muniz Sep 12 '16 at 01:24
  • Ok, if the server is never going to return an array, then the solution given should work. I'll include a more complete example since I think you're having trouble getting it integrated – Tibrogargan Sep 12 '16 at 01:26
  • I changed to this according your instructions: ConsultaWSCep consultaWSCep = g.fromJson(json, ConsultaWSCep.class); System.out.println("Cep: "+consultaWSCep.getCep()); and it worked :-D thank you very much I removed the object c never used. – Anderson Muniz Sep 12 '16 at 01:29
  • Awesome. Glad I could help. If you could accept the answer that would be great – Tibrogargan Sep 12 '16 at 01:30