[GSON][ANDROID] Receber uma lista de objetos vindas de um JSON [Resolvido]

Olá galerá tudo blz?

To com um pequeno/grande problema quando estou tentando receber um JSON que vem mais de um objetos da mesma instancia e eu queria poder receber isso em um Arraylist desse Objeto para que eu possa salvar no meu banco de dados.
Segue o código da minha classe GetHttp que é onde eu faço toda a parte de trazer o JSON e tento criar as classes com ele.

[code]package cyborg.rpgx;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.lang.reflect.Type;
import java.net.URI;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

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

import cyborg.rpgx.model.Friends;
import cyborg.rpgx.model.Game;
import cyborg.rpgx.model.Initialize;
import cyborg.rpgx.model.News;
import cyborg.rpgx.model.User;
import cyborg.rpgx.model.listFriend;

import android.util.Log;

public class GetHttp {

public GetHttp() {
	super();
	// TODO Auto-generated constructor stub
}

public String page = "";
private ArrayList arrayGame;
private ArrayList arrayFriends;
private ArrayList arrayNews;
private Type gameType = new TypeToken<List<Game>>() {}.getType();
private Type friendsType = new TypeToken<List<Friends>>() {}.getType();
private Type newsType = new TypeToken<List<News>>() {}.getType();


public GetHttp(String URL) throws Exception{
    BufferedReader bufferedReader = null;
    try{
        HttpClient client = new DefaultHttpClient();
        client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "android");
        HttpGet request = new HttpGet();
        request.setHeader("Content-Type", "text/plain; charset=utf-8");
        request.setURI(new URI(URL));
        HttpResponse response = client.execute(request);
        bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuffer stringBuffer = new StringBuffer("");
        String line = "";
        String NL = System.getProperty("line.separator");
        
        Log.d("GetHttp","Iniciando leitura de buffer.");
        while ((line = bufferedReader.readLine()) != null){
            stringBuffer.append(line + NL);
            Log.d("GetHttp", stringBuffer.toString());
        }
        bufferedReader.close();
        Log.d("GetHttp", "Leitura de buffer finalizada");
        
        page = stringBuffer.toString();
    }catch (Exception e) {
        Log.e("GetHttp", e.toString());
    }finally{
        if (bufferedReader != null){
            try{
                bufferedReader.close();
            }catch (IOException e){
                Log.e("GetHttp", e.toString());
            }
        }
    }
}

public User JSONFile(String data){
    try{
    	String urlx = "http://189.64.50.27/CyborgService/login.php?request=";
    	String urluser =urlx+"1&"+data;
    	String urlfriend =urlx+"3&"+data;
    	String urlnews =urlx+"2&"+data;
    	String urlgame =urlx+"4&"+data;
    	
    	
        //Le a pagina
        GetHttp inituser = new GetHttp(urluser);
        GetHttp initfriend = new GetHttp(urlfriend);
        GetHttp initnews = new GetHttp(urlnews);
        GetHttp initgame = new GetHttp(urlgame);
    	
   	    String pageuser = inituser.page;
        String pagefriends = initfriend.page;
        String pagenews = initnews.page;
        String pagegame = initgame.page;
    	
        Gson gson = new Gson();
        User user = null;
        try {
        		user = gson.fromJson(pageuser, User.class);
        		
        }catch (Exception e) {
	// TODO: handle exception
        	Log.e("user", e.toString());

		}

        try{
			arrayGame = gson.fromJson(pagegame, gameType); // É aqui o erro. Penso que seja a variavel gameType que está com problema.
			//arrayGame = gson.fromJson(pagegame, gameType);
		}catch (Exception e) {
			// TODO: handle exception
			Log.e("Array", e.toString());
		}
		
		try{
		Game gamex = (Game) arrayGame.get(1);
		
		Log.e("GAME", "SUCESS");
		//aqui vai o metodo de inserção no banco junto com o try/catch
		// criar um for/while parar poder realizar as 'n' inserções
		//	for (int i = 0; i < arrayGame.size(); i++) {
					
				Log.e("GAMEX", "GAME INSERT");
			//}
       		
			
		} catch (Exception e) {
			// TODO: handle exception
			Log.e("Game", e.toString());
			Log.d("ADD Games", "Não foi possivel fazer a inserção de Jogos no banco;");
		}

        Log.d("WebService", "Dados baixados com sucesso!");

       	return user;

    }catch (Exception e) {
        Log.e("GSON",e.toString());
    }
    return null;

}

}

[/code]

O meu JSON retornado:

O erro:

Já tentei tudo o que eu sabia e até debuguei o GSON, mas não consegui achar o problema, comentei no código onde acho que possa ser o problema.
Agradeço desde já pela ajuda pessoal.

Algum HELP? Já esgotei meus neurônios tentando resolver isso…

Caramba, ninguém sabe sobre disserializar uma lista com gson, estou com esse problema também, e não encontro…

Caso alguém encontre, posta ai blz…

até mais

Boa sorte

Rmazaro, eu consegui resolver o meu problema, alias ja foi resolvido infelizmente o problema estava na minha classe game, que eu declarava o bd, e estava dando erro ai. Nao entendi mto bem o pq do erro mas funcionou.
Se quizer passar sua duvida talvez eu possa te ajudar.

Pode ajudar ?
WebService JSON PHP + Android GSON ?
Pessoal, como eu faço para consumir um serviço php ?

http://gdias.ind.br/michel/teste/get_all_clientes.php/

retona pra mim isso :


 

{"clientes":[{"cli_id":"1","cli_cpf":"23432","cli_cnpj":"324324","cli_pessoatipo":"Fisica","cli_tipodevenda":"Zona","cli_estado":"","cli_cidade":"","cli_bairro":"","cli_insest":"","cli_fone":"","cli_fax":"","cli_contato":"","cli_mail":"","cli_cob_cep":"","cli_cob_cidade":"","cli_cob_bairro":"","cli_cob_numero":"","cli_observacao":"","cli_alerta":""},



meu codigo e este no Android:

package br.com.exemplo.webservice;

import java.util.ArrayList;
import java.util.List;
import br.com.exemplo.model.Cliente;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;
public class ClienteREST {
private static final String URL_WS = "http://gdias.ind.br/michel/teste/get_all_clientes.php/";
    
    public Cliente getCliente(int id) throws Exception {

        String[] resposta = new WebServiceCliente().get(URL_WS + id);

        if (resposta[0].equals("200")) {
            Gson gson = new Gson();
            Cliente cliente = gson.fromJson(resposta[1], Cliente.class);
            return cliente;
        } else {
            throw new Exception(resposta[1]);
        }
    }

    public List&lt;Cliente&gt; getListaCliente() throws Exception {

        //String[] resposta = new WebServiceCliente().get(URL_WS    + "buscarTodosGSON");
        String[] resposta = new WebServiceCliente().get(URL_WS + "get_all_clientes.JSON");

        if (resposta[0].equals("200")) {
            Gson gson = new Gson();
            ArrayList&lt;Cliente&gt; listaCliente = new ArrayList&lt;Cliente&gt;();
            JsonParser parser = new JsonParser();
            JsonArray array = parser.parse(resposta[1]).getAsJsonArray();

            for (int i = 0; i &lt; array.size(); i++) {
                listaCliente.add(gson.fromJson(array.get(i), Cliente.class));
            }
            return listaCliente;
        } else {
            throw new Exception(resposta[1]);
        }
    }

    public String inserirCliente(Cliente cliente) throws Exception {

        Gson gson = new Gson();
        String clienteJSON = gson.toJson(cliente);

        String[] resposta = new WebServiceCliente().post(URL_WS + &quot;inserir&quot;,
                clienteJSON);

        if (resposta[0].equals(&quot;200&quot;)) {
            return resposta[1];
        } else {
            throw new Exception(resposta[1]);
        }
    }

    public String deletarCliente(int id) {

        String[] resposta = new WebServiceCliente()
                .get(URL_WS + &quot;delete/&quot; + id);
        return resposta[1];
    }
}
 

Ja tentou fazer como eu fiz no meu post? O que estava errao no meu era minha classe base. Se puder poste sua classe do webservice, pois o link que passou do JSON parece estar correta mesmo vindo milhares de informações.

Também não entendi muito bem pq usou um array de String e não simplesmente uma lista para deserializar seu JSON? Talvez tenha entendido errado o que você pediu, mas okey.

Se puder dar uma clareada posso te ajudar nisso =)

[code]package br.com.droid.resources;

import br.com.droid.exception.NoContentException;
import br.com.droid.model.Cliente;
import br.com.droid.model.ClienteBusiness;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;
import java.util.ArrayList;
import javax.ws.rs.*;

@Path("/cliente")
public class ClienteResource {

@GET
@Path("/buscarTodos")
@Produces("application/json")
public ArrayList&lt;Cliente&gt; selTodos() throws ClassNotFoundException{
	return new ClienteBusiness().buscarTodos();
}

@GET
@Path("/buscarTodosGSON")
@Produces("application/json")
public String selTodosGSON() throws ClassNotFoundException{
	return new Gson().toJson(new ClienteBusiness().buscarTodos());
}

@GET
@Path("/{id}")
@Produces("application/json")
public Cliente getCliente(@PathParam("id") int id) throws ClassNotFoundException{
	Cliente cliente = new ClienteBusiness().buscar(id);
	
	if(cliente == null)
		throw new NoContentException("Cliente não encontrado!");
	
	return cliente;
}

@GET
@Path("/delete/{id}")
@Produces("application/json")
public String deleteCliente(@PathParam("id") int id) throws ClassNotFoundException{
	return new ClienteBusiness().deletar(id);
}

@POST
@Path("/inserir")
@Produces("application/json")
@Consumes("application/json")
public String inserirCliente(Cliente cliente) throws ClassNotFoundException {
	return new ClienteBusiness().inserir(cliente);
}

@POST
@Path("/inserirLista")
@Produces("application/json")
@Consumes("application/json")
public String inserirLista(String listaClientesJson) throws ClassNotFoundException {
	
	Gson gson = new Gson();
	ArrayList&lt;Cliente&gt; listaClientes = new ArrayList&lt;Cliente&gt;();
	JsonParser parser = new JsonParser();
    JsonArray array = parser.parse(listaClientesJson).getAsJsonArray();
    
    for (int i = 0; i &lt; array.size(); i++) {
    	listaClientes.add(gson.fromJson(array.get(i), Cliente.class));
	}
    
	return new ClienteBusiness().inserirLista(listaClientes);

}

}
[/code]

Bom dia e obrigado pela ajuda…

Se eu setar na String : http://webservice/teste.json
Funciona perfeito.

Agor se eu setar na String http://webservice/teste.php

nao funciona.

Pois esse arquivo teste.php que vai fazer JSON serealizar os dados… ai o GSON não consegue Deserealizar…

o web service e PHP, do cliente.
Teste em outros web service o codigo funciona. so nao funciona com web service php…

abraço

[code]package br.com.junior.clientes;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import br.com.junior.adapters.ClienteAdapter;
import br.com.junior.dao.ClienteDAO;
import br.com.junior.vo.ClienteVO;
import br.com.junior.clientes.R;

//@ Junior - Cadastro de Clientes 10/07/2012
public class ListarClientes extends Activity {

ListView ltw;
List&lt;ClienteVO&gt; lista = null;
int idItem = 0;
private static int MENU_EDITAR = 1;
private static int MENU_APAGAR = 2;
private static int MENU_CALL = 3;
private static int MENU_ONLINE = 4;
private static int MENU_LOCAL = 5;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.listar);
	ltw = (ListView) findViewById(R.id.ltvDados);
	ltw.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

	final Button btnApagar = (Button) findViewById(R.id.btnApagar);

	registerForContextMenu(ltw);

	ltw.setOnItemClickListener(new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView&lt;?&gt; arg0, View arg1, int arg2, long arg3) {
			btnApagar.setVisibility(0);
		}
	});
}

@Override
public void onResume() {
	super.onResume();

}

public void Apagar_click(View v) {
	String nomes = &quot;&quot;;
	SparseBooleanArray checkeds = ltw.getCheckedItemPositions();

	for (int i = 0; i &lt; checkeds.size(); i++) {
		nomes += lista.get(checkeds.keyAt(i)).getEmpresanome() + &quot;, &quot;;
	}

	Toast.makeText(getBaseContext(), nomes, Toast.LENGTH_SHORT).show();
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {

	AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
	menu.setHeaderTitle(lista.get(info.position).getEmpresanome());
	menu.add(Menu.NONE, MENU_EDITAR, 0, &quot;Editar&quot;);
	menu.add(Menu.NONE, MENU_APAGAR, 0, &quot;Apagar&quot;);
	menu.add(Menu.NONE, MENU_CALL, 0, &quot;Telefonar&quot;);
}

public boolean onCreateOptionsMenu(Menu menu) {
	@SuppressWarnings(&quot;unused&quot;)
	MenuItem item = menu.add(0, MENU_ONLINE, 0, &quot;Online&quot;);
	// item.setIcon(R.drawable.config);
	// URL

	item = menu.add(0, MENU_LOCAL, 0, &quot;Local Android&quot;);
	// item.setIcon(R.drawable.config);
	return true;

}

@Override
public boolean onMenuItemSelected(int featureID, MenuItem menu) {

	if (menu.getItemId() == MENU_ONLINE) {
		StringBuilder strURL = new StringBuilder();
		strURL.append(&quot;http://twitter.com/statuses/public_timeline.json&quot;);

		// Transforma String em URL
		try {
			URL url = new URL(strURL.toString());
			HttpURLConnection http = (HttpURLConnection) url.openConnection();
			InputStreamReader ipr = new InputStreamReader(http.getInputStream());
			BufferedReader bf = new BufferedReader(ipr);
			List&lt;String&gt; lista = new ArrayList&lt;String&gt;();
			String linha = "";

			while ((linha = bf.readLine()) != null) {
				lista.add(linha.split("\\|")[0]);
			}
			ArrayAdapter&lt;String&gt; ad = new ArrayAdapter&lt;String&gt;(
					getBaseContext(), android.R.layout.simple_list_item_1,lista);
			ltw.setAdapter(ad);

		} catch (Exception e) {
			Toast.makeText(getBaseContext(), "Erro: " + e.getMessage(),
			Toast.LENGTH_LONG).show();
		}

	}

	if (menu.getItemId() == MENU_LOCAL) {
		ClienteDAO dao = new ClienteDAO(getBaseContext());
		lista = dao.getAll();
		ltw.setAdapter(new ClienteAdapter(getBaseContext(), lista));
		return true;
	}

	return true;
}

@Override
public boolean onContextItemSelected(MenuItem item) {

	AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

	idItem = lista.get(info.position).getId();

	if (item.getItemId() == MENU_EDITAR) {
		Intent it = new Intent(getBaseContext(), Editar.class);
		it.putExtra("codigo", idItem);
		startActivity(it);
	} else if (item.getItemId() == MENU_APAGAR) {
		Builder msg = new Builder(ListarClientes.this);
		msg.setMessage("Deseja excluir este cliente?");
		msg.setPositiveButton("Sim", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface arg0, int arg1) {
				ClienteDAO dao = new ClienteDAO(getBaseContext());
				ClienteVO cliente = dao.getById(idItem);
				if (dao.delete(cliente) == true) {
					Toast.makeText(getBaseContext(),"Excluido com sucesso!", Toast.LENGTH_SHORT).show();
					ltw.setAdapter(new ClienteAdapter(getBaseContext(), dao.getAll()));
				}
			}
		});
		msg.setNegativeButton("Não", null);

		msg.show();
	} else if (item.getItemId() == MENU_CALL) {
		Uri uri = Uri.parse("tel:" + lista.get(info.position).getFone());
		Intent it = new Intent(Intent.ACTION_DIAL, uri);
		startActivity(it);
	}

	return super.onContextItemSelected(item);
}

}
[/code]

Bom cara, seguinte, das duas uma, ou o seu fonte em php ta errado na hora de escrever o json ou sua classe que Lê a página não ta certa.

Como seu webservice ta escrevendo o json na página? coloca a função que vc ta usando ai pf… por que pelo que vc falou acho que ja sei onde ta o problema.

Eu prefiro fazer em java o web service, ja estaria pronto, mas o cliente ja tem ele todo em php…
segue um dos arquivos php…

[code]<?php

// array for JSON response
$response = array();

// include db connect class

require_once ‘db_connect.php’;

// connecting to db

$db = new DB_CONNECT();

// get all products from products table

$result = mysql_query("SELECT *FROM teste") or die(mysql_error());

// check for empty result

if (mysql_num_rows($result) > 0) {

// looping through all results

// products node

$response[&quot;teste&quot;] = array();



while ($row = mysql_fetch_array($result)) {

    // temp user array

    $product = array();

    $product[&quot;pid&quot;] = $row[&quot;pid&quot;];

    $product[&quot;name&quot;] = $row[&quot;name&quot;];

    $product[&quot;price&quot;] = $row[&quot;price&quot;];

    $product[&quot;description&quot;] = $row[&quot;description&quot;];

    $product[&quot;created_at&quot;] = $row[&quot;created_at&quot;];

    $product[&quot;updated_at&quot;] = $row[&quot;updated_at&quot;];


    // push single product into final response array

    array_push($response[&quot;teste&quot;], $product);

}

// success

$response[&quot;success&quot;] = 1;



// echoing JSON response

echo json_encode($response);

} else {

// no products found

$response[&quot;success&quot;] = 0;

$response[&quot;message&quot;] = &quot;No products found&quot;;



// echo no users JSON

echo json_encode($response);

}

?>
[/code]

Era o que eu imaginava,

header("Content-Type: application/json");

Adiciona essa linha de código antes de dar o “echo”. Ai ele vai escrever na sua página o json certinho. Ai consegue deserializar sem problemas, se ainda sim não der certo, ai o problema é sua classe que Lê a página que não ta fazendo certo, mas acho que só isso resolve.

Lembrando que não se deve escrever mais nada na página pois normalmente vc lê a String da página.