2013-08-20 8 views
9

Eclipse visualizzava un avviso di sicurezza del tipo e ho provato quasi tutto a sradicarlo (ovviamente sopprimendo sarebbe un'opzione) ma sfortunatamente non ho avuto alcun successo.
Sai come devo cambiare il mio codice in modo che non ci sia più alcun avviso di sicurezza del tipo. O è @SuppressWarnings("unchecked") l'unico modo? Viene visualizzataCome aggiungere ArrayList <String> all'array JSON - tenere presente la sicurezza del tipo

ArrayList<String> arrayList= (ArrayList<String>) Classname.getArrayList();  
JSONArray obj = new JSONArray(); 
obj.addAll(arrayList); 

nell'ultima riga seguente avviso sicurezza Tipo:

sicurezza Tipo: Il metodo addAll (Collection) appartiene al tipo ArrayList grezzo. I riferimenti al tipo generico ArrayList devono essere parametrizzati

JSONArray è da org.json.simple.JSONArray. Consiglieresti un altro pacchetto?

+0

Scusa ma non si può fare nulla perché il problema è nell'implementazione di JSONArray, non utilizza i generici. – Felquir

+0

Consiglieresti di utilizzare un'altra implementazione di JSONArray? In altre parole, per utilizzare un altro pacchetto di "org.json.simple.JSONArray" o meglio aggiungere "@SuppressWarnings ('unchecked')'? – Brenne

+0

Leggi la mia risposta, per favore. – Felquir

risposta

2

Se si desidera lavorare con JSON andare questa libreria, questo la biblioteca ha un bel supporto https://code.google.com/p/google-gson/.

Questo è un esempio:

Gson gson = new Gson(); 
Collection<Integer> ints = Lists.immutableList(1,2,3,4,5); 

(Serialization) 
String json = gson.toJson(ints); ==> json is [1,2,3,4,5] 

Grazie

0

Dalla documentazione per JSONArray, sembra che sia extends ArrayList il tipo non valido (non ha un parametro di tipo generico). Questo è un esempio di gestione del codice legacy non generico e l'unico modo per procedere è di accertarsi che JSONArray si aspetti di ricevere alcuni String s e quindi di sopprimere l'avviso.

(Il vero modo per risolvere il problema sarebbe quello di aggiornare JSONArray di utilizzare farmaci generici, ma nel frattempo, è necessario utilizzare il tipo grezzo.)

3

org.json e sull'uso parser JSON org.json.simple tipi prime di collezioni sotto. Se stai cercando il supporto Generics 10 prova prova Google Gson. Ecco come si dovrebbe fare per la serializzazione vostro generico ArrayList con GSON:

Gson gson = new Gson(); 

ArrayList<String> arrayList= (ArrayList<String>) ClassName.getArrayList(); 

// Serializing to a JSON element node 
JsonElement jsonElement = gson.toJsonTree(arrayList); 
System.out.println(jsonElement.isJsonArray()); // true 

// Or, directly to JSON string 
String json = gson.toJson(arrayList); 
System.out.println(json); 

Ecco come si deserializzare la stessa stringa JSON con i suoi Generics intatte:

Type type = new TypeToken<ArrayList<String>>(){}.getType(); 
ArrayList<String> arrayList = gson.fromJson(json, type); 
1

La risposta breve per la tua domanda è che devi sopprimerlo per farlo andare via. Il problema non riguarda ciò che viene inserito usando il metodo addAll, poiché JSONArray non ha modo di garantire la sicurezza del tipo se non viene fornito il tipo.

JSONArray eredita un ArrayList non parametrizzata e il metodo addAll è definito come:

public boolean addAll(java.util.Collection<? extends E> es) 

Senza fornire il parametro di tipo, e ricade in Object, che rende il metodo addAll un metodo che può aggiungere una raccolta che contiene QUALSIASI sopra le collezioni esistenti.Pertanto, si può fare qualcosa di simile:

List<Dog> dogs = new ArrayList<Dog>(); 
dogs.add(new Chiwawa()); 

List<Car> cars = new ArrayList<Car>(); 
cars.add(new BMW()); 

JSONArray jsonArray = new JSONArray(); 
jsonArray.addAll(dogs); 
jsonArray.addAll(cars); 

Cani e automobili vengono sommati per lo stesso JSONArray (ArrayList) e trattati come malapena oggetto. Se fai qualcosa del genere, quando recuperi qualsiasi oggetto, non hai modo di sapere se si tratta di un cane o di un'auto. Questo è il motivo per cui l'avvertimento esiste.

Utilizzando il parametro di tipo generico (ad esempio cani), la definizione addAll sarà come:

public boolean addAll(java.util.Collection<? extends Dog> es) 

Questa assicurarsi il parametro può accettare solo una collezione di cane e di classe figlio. Pertanto, quando lo si recupera dalla raccolta, è sicuro assegnare l'oggetto di recupero a Cane.

L'avviso non è perché hai fatto qualcosa di sbagliato. È perché JSONArray eredita una raccolta non parametrizzata. Sentiti libero di sopprimerlo.

0

Utilizzare la libreria Gson per convertire ArrayList in JsonArray.

Gson gson = new GsonBuilder().create(); 
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();