Anderson Muniz Anderson Muniz - 2 months ago 14
Java Question

Expected BEGIN_ARRAY but was STRING at line 1 column 5

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

Answer

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());