2013-05-07 14 views
10

Ho alcuni dati memorizzati in elementi Java e ho bisogno di restituirlo in un determinato formato - JSONObject. Mentre la mia implementazione funziona correttamente, ricevo comunque un messaggio di avvertenza da eclipse (Versione: Juno Service Release 2):JSON e Generics in Java - Tipo avviso di sicurezza

"Tipo di sicurezza: il metodo messo (Oggetto, Oggetto) appartiene al tipo non elaborato HashMap. di tipo generico HashMap dovrebbe essere parametrizzato "

questo è il mio codice:

public interface Element {...} 

public abstract class AbstractElement implements Element {...} 

public final class Way extends AbstractElement {...} 

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

import org.json.simple.JSONArray; 
import org.json.simple.JSONObject; 

public class WayToJsonConverter{ 
    ... 
    public JSONObject wayToJson(){ 
     JSONObject obj = new JSONObject(); 
     obj.put("id",way.getId()); 
     ... 
     return obj; 
    } 
    ... 
} 

La linea è problematico: obj.put("id",way.getId());

c'è un modo per risolvere questo emettere altro quindi aggiungere @SuppressWarnings("unchecked")?

+0

qual è il tipo di ritorno di 'getId()'? – SudoRahul

+0

Il tipo di ritorno è: String –

+0

In tal caso, non vi sono problemi con 'obj.put (" id ", way.getId());'. Deve essere un'altra linea che dà questo avvertimento! – SudoRahul

risposta

15

Qual è il tuo JSONObject, ereditato da HashMap? Se lo fa, l'avvertono probabilmente significa che il vostro dovrebbe dichiarare l'istanza JSONObject come segue:

JSONObject<String,Object> obj=new JSONObject<String,Object>(); 

Aggiornato: Guardate la definizione del JSONObject:

public class JSONObject extends HashMap 

si estende HashMap, ma non supporta il parametro tipo, se la sua definizione è

public class JSONObject<K,V> extends HashMap<K,V> 

allora potremmo scrivere

JSONObject<String,Object> obj=new JSONObject<String,Object>(); 

e il metodo put non genererà più l'avviso

+11

Quando cerco di farlo, visualizzo il messaggio: "Il tipo JSONObject non è generico, non può essere parametrizzato con argomenti " –

+0

Terze parti. Puoi trovarlo qui: https://code.google.com/p/json-simple/ –

+17

Ho trovato che estende HashMap, ma non ha parametri di tipo nella definizione della classe, quindi non possiamo fare nulla piuttosto che aggiungere @SuppressWarnings ("deselezionato") qui ... – ltebean

2

Se non è possibile passare ad un'altra libreria o modificare il codice di questa libreria per rendere più generica, l'unica altra opzione sarebbe quella di scrivere un wrapper questa libreria che la usa e supporta correttamente i generici.

Così si avrebbe il proprio JSONObject classe che conterrebbe un org.json.simple.JSONObject, permetterà di estendere e implementare HashMap<String, Object>Map<String, Object>, e dovrebbe contenere metodi di inoltro per tutti i metodi di org.json.simple.JSONObject.

Si dovrebbe ancora inserire @SuppressWarnings("unchecked") in questa classe, ma sarebbe limitato a questa classe e tutto il resto del codice potrebbe essere privo di avvisi generici o la soppressione di essi.

+1

Se devo ancora usare il suppressWarning non ho risolto il problema ma spostato esso. Per ora, tutto il trattamento con JSON è fatto in una classe, quindi non mi sarà di grande aiuto. Inoltre, ho bisogno di restituire un JSONObject ad alcuni metodi dell'interfaccia che sto implementando, quindi Warping non mi aiuterà comunque. Sembra che questa sia una limitazione del pacchetto JSON dato e non posso fare molto per renderlo migliore. –

0

FYI org.codehaus.jettison.json.JSONObject non causerà questo avviso. Quando si utilizza il codice JSONObject di codehaus, è anche possibile rilevare gli errori di analisi tramite org.codehaus.jettison.json.JSONException. Vedi https://github.com/codehaus/jettison per i dettagli.

0

è possibile creare un oggetto di mappa e poi fare un cast esplicito al JSONObject

Map<String, String> obj = new HashMap<String, String>(); 
obj.put("id",way.getId()); 
JSONObject jsonObj = (JSONObject) obj; 

Ma nota che questo limiterà si include solo "Strings" nella vostra JSON. e vedrai errori di compilazione se metti un'altra struttura dati. Dì un array.

+0

nel caso precedente non è necessario aggiungere l'annotazione "sopprimi avvertimento" – Kranthi

+0

'java.util.HashMap non può essere lanciato su org.json.simple.JSONObject' –

0

Un'altra opzione è di inizializzare il JSONObject con un (parametrizzato) Map<String, Object>. In questo modo, un valore può essere di qualsiasi tipo JSON valido ed è possibile evitare l'avviso unchecked. Per esempio.:

public class WayToJsonConverter{ 
    ... 
    public JSONObject wayToJson(){ 
     Map<String, Object> forJsonObj = new HashMap<>(); 
     forJsonObj.put("id",way.getId()); // No warning, hurray! 
     forJsonObj.put("integer", 14); 
     forJsonObj.put("floating", 1.4); 
     JSONObject obj = new JSONObject(forJsonObj); 
     ... 
     return obj; 
    } 
    ... 
} 
+0

' JSONObject' non ha costruttori parametrizzati. –

+0

@ HarshPandey- Nella mia risposta non utilizzo un costruttore parametrizzato di 'JSONObject'. – asherbar

+0

'JSONObject obj = new JSONObject (forJsonObj);' non stai utilizzando un costruttore con parametri qui? –