CharlesAlves:
Tenta passar além da string json uma instancia de Class ai tu faz assim
// Pega uma referencia a class
private List converterJsonToListDescontoProdutoCondicao(String json, Class<T> classe) {
Gson gson = getGson();
// Obtem uma instancia de TypeToken a partir dela e gera o Type como antes
Type listType = TypeToken.get(classe).getType();
// Como no retorno não foi determinado um tipo e é possivel fazer um cast com segurança
// e internamente no metodo não é utilizado nada do list eu fiz assim com Object
Map<String, Object> mapa = gson.fromJson(json, listType);
List<Object> lista = null;
for( String key : mapa.keySet()){
lista = mapa.get(key);
}
return lista;
}
Eu não testei o codigo e nunca utilizei esta API para json mas de acordo com a documentação acho que dá certo, testa ai e dá o feedback, o retorno poderia ser mais especifico caso fosse utilizado em uma classe a parte com a utilização de generics e os metodos poderiam ser sobrecarregados pra abranger um escopo maior, mas acho que assim funciona, só vai dar problema caso o a string não resulte em um List, acho que com reflection dá pra resolver isso.
CharlesAlves,
Se eu tento converter para Object não gera nenhum erro,
agora seu eu tentar converter para ele me retorna um LinkedHashMap e da erro, estou postando minha classe abaixo.
package app;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import java.io.*;
import java.lang.reflect.Type;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.codehaus.jettison.json.JSONException;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author rodrigo
*/
public class Main {
public static void main(String args[]) throws FileNotFoundException, IOException, URISyntaxException, JSONException{
String json = readJsonFromFile();
Gson gson = getGson();
Type type = null;
List<DescontoQuantidadeCondicao> lista = null ;
// Primeiro conversao para object --> OK
// verifica se é um array
if( json.contains("[")){
type = new TypeToken<Map<String,List<DescontoQuantidadeCondicao>>>(){}.getType();
lista = (List<DescontoQuantidadeCondicao>) converterJsonToObject(json, type);
}else{
type = new TypeToken<Map<String,DescontoQuantidadeCondicao>>(){}.getType();
lista = new ArrayList<DescontoQuantidadeCondicao>();
lista.add((DescontoQuantidadeCondicao) converterJsonToObject(json, type));
}
System.out.println(lista.get(0).getId());
// saida esta ok ...
// agora tenta converter usando Generics
List<DescontoQuantidadeCondicao> lista2 = converterJsonToList(json, DescontoQuantidadeCondicao.class);
System.out.println(lista2.get(0).getId());
// da a seguinte mensagem de erro.
// Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to app.DescontoQuantidadeCondicao
// at app.Main.main(Main.java:59)
}
private static Object converterJsonToObject( String json, Type type){
Gson gson = getGson();
Map<String, Object> mapa = gson.fromJson(json, type);
Object obj = null;
for( String key : mapa.keySet()){
obj = mapa.get(key);
}
return obj;
}
private static <T> List<T> converterJsonToList(String json, Class<T> aClass) {
Type type = null;
List<T> lista = null ;
if( json.contains("[")){
type = new TypeToken<Map<String,List<T>>>(){}.getType();
lista= (List<T>) converterJsonToObject(json, type);
}else{
type = new TypeToken<Map<String,T>>(){}.getType();
lista = new ArrayList<T>();
lista.add((T) converterJsonToObject(json, type));
}
return lista;
}
public static Gson getGson(){
GsonBuilder builder = new GsonBuilder();
String formato = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").toPattern();
builder.setDateFormat(formato);
return builder.create();
}
public static String readJsonFromFile() throws FileNotFoundException, URISyntaxException, IOException{
File file = new File(Produto.class.getResource("desconto.js").toURI());
BufferedReader br = new BufferedReader(new FileReader(file));
String linha = "";
String json = "";
while( (linha = br.readLine()) != null ){
json += linha;
}
br.close();
return json;
}
public static String readWebService(){
ClientConfig cc = new DefaultClientConfig();
Client cliente = Client.create(cc);
WebResource wr = cliente.resource("http://localhost:8080/webservice").path("descontosquantidade");
String resposta = wr.get(String.class);
return resposta;
}
}