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

11 respostas
M

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.

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;
 
    }

}

O meu JSON retornado:

[{"id_cr_game":"1","name_cr_game":"O inicio do fim","scene_cr_game":"Mago","system_cr_game":"Storyteller","max_players_cr_game":"5","pass_cr_game":"arcadia","master_cr_game":"mkdarkness","date_start_cr_game":"2012-07-31 20:12:15","date_end_cr_game":null},{"id_cr_game":"2","name_cr_game":null,"scene_cr_game":"Vampiro a Mascara","system_cr_game":"Storyteller","max_players_cr_game":"6","pass_cr_game":null,"master_cr_game":"mkdarkness","date_start_cr_game":"2012-08-03 21:42:27","date_end_cr_game":null},{"id_cr_game":"5","name_cr_game":"Principe encantado","scene_cr_game":"Trevas","system_cr_game":"Daemon","max_players_cr_game":"3","pass_cr_game":null,"master_cr_game":"Luis","date_start_cr_game":"2012-08-11 12:23:40","date_end_cr_game":null}]

O erro:

09-01 14:41:39.480: E/Array(310): java.lang.IllegalArgumentException: class android.database.sqlite.SQLiteDatabase declares multiple JSON fields named mLock

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.

11 Respostas

M

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

R

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

M

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.

J

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 + "inserir",
                clienteJSON);

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

    public String deletarCliente(int id) {

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

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 =)

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

	}
}
J

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

J
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);
	}
}
M

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.

J

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..

&lt;?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(&quot;SELECT *FROM teste&quot;) or die(mysql_error());

// check for empty result

if (mysql_num_rows($result) &gt; 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);

}

?&gt;
M

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.

Criado 1 de setembro de 2012
Ultima resposta 26 de set. de 2012
Respostas 11
Participantes 3