JSON e generics in Java: digita avviso di sicurezza

Translate

Ho alcuni dati memorizzati in elementi Java e devo restituirli in un determinato formato: JSONObject. Sebbene la mia implementazione funzioni correttamente, ricevo ancora un messaggio di avviso da eclipse (Versione: Juno Service Release 2):

"Sicurezza dei tipi: il metodo put (Object, Object) appartiene al tipo raw HashMap. I riferimenti al tipo generico HashMap dovrebbero essere parametrizzati"

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 problematica è:obj.put("id",way.getId());

C'è un modo per risolvere questo problema oltre all'aggiunta@SuppressWarnings("unchecked")?

This question and all comments follow the "Attribution Required."

Tutte le risposte

Translate

Qual è il tuo JSONObject, eredita da HashMap? In caso affermativo, l'avviso probabilmente significa che è necessario dichiarare l'istanza JSONObject come segue:

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

Aggiornato: guarda la definizione di JSONObject:

public class JSONObject extends HashMap

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

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

fonte
Translate

Se non puoi passare a un'altra libreria o modificare il codice di questa libreria per renderlo generico, l'unica altra opzione sarebbe scrivere un wrapper attorno a questa libreria che la utilizzi e supporti correttamente i generici.

Quindi avresti il tuoJSONObjectclasse che conterrebbe un fileorg.json.simple.JSONObject, si estenderebbeHashMap<String, Object>e implementareMap<String, Object>e conterrebbe metodi di inoltro per tutti i metodi diorg.json.simple.JSONObject.

Dovresti ancora mettere@SuppressWarnings("unchecked")in questa classe, ma sarebbe limitato a questa classe e tutto il resto del codice potrebbe essere privo di avvertimenti generici o della loro soppressione.

fonte
Translate

la classe pubblica JSONObject estende HashMap implementa Map, JSONAware, JSONStreamAware

Ma non ha il parametro di tipo nella definizione della classe, l'unica opzione che hai è di aggiungere @SuppressWarnings ("non selezionato")

fonte
Translate

È possibile creare un oggetto mappa e quindi eseguire un cast esplicito a JSONObject

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

Ma tieni presente che questo ti limiterà a includere solo "Stringhe" nel tuo JSON. e vedrai errori di compilazione se metti un'altra struttura dati. Pronuncia un array.

fonte
Translate

Cordiali salutiorg.codehaus.jettison.json.JSONObjectnon causerà questo avviso. Quando si utilizza JSONObject di codehaus, si ha anche la possibilità di rilevare gli errori di analisi tramiteorg.codehaus.jettison.json.JSONException. Vederehttps://github.com/codehaus/jettisonper dettagli.

fonte
Translate

Un'altra opzione è inizializzare il fileJSONObjectcon un (parametrizzato)Map<String, Object>. In questo modo, un valore può essere di qualsiasi tipo JSON valido ed eviti iluncheckedavvertimento. 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;
    }
    ...
}
fonte
Leave a Reply
You must be logged in to post a answer.
Circa l'autore