JSON und Generics in Java - Geben Sie eine Sicherheitswarnung ein

Translate

Ich habe einige Daten in Java-Elementen gespeichert und muss sie in einem bestimmten Format zurückgeben - JSONObject. Während meine Implementierung einwandfrei funktioniert, erhalte ich immer noch eine Warnmeldung von Eclipse (Version: Juno Service Release 2):

"Typensicherheit: Die Methode put (Object, Object) gehört zum Rohtyp HashMap. Verweise auf den generischen Typ HashMap sollten parametrisiert werden"

Das ist mein Code:

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

Die problematische Linie ist:obj.put("id",way.getId());

Gibt es eine andere Möglichkeit, dieses Problem zu lösen, als es hinzuzufügen?@SuppressWarnings("unchecked")?

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

Alle Antworten

Translate

Was ist Ihr JSONObject, erbt es von HashMap? Wenn dies der Fall ist, bedeutet die Warnung wahrscheinlich, dass Sie die JSONObject-Instanz wie folgt deklarieren sollten:

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

Aktualisiert: Sehen Sie sich die Definition des JSONObject an:

public class JSONObject extends HashMap

Es erweitert HashMap, unterstützt jedoch keinen Parametertyp, wenn seine Definition lautet

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

dann könnten wir schreiben

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

und die put-Methode generiert die Warnung nicht mehr

Quelle
Translate

Wenn Sie nicht zu einer anderen Bibliothek wechseln oder den Code dieser Bibliothek ändern können, um sie generisch zu machen, besteht die einzige andere Option darin, einen Wrapper um diese Bibliothek zu schreiben, der sie verwendet und Generika ordnungsgemäß unterstützt.

Du hättest also deine eigeneJSONObjectKlasse, die eine enthalten würdeorg.json.simple.JSONObjectwürde verlängernHashMap<String, Object>und implementierenMap<String, Object>und würde Weiterleitungsmethoden für alle Methoden von enthaltenorg.json.simple.JSONObject.

Sie müssten noch setzen@SuppressWarnings("unchecked")in dieser Klasse, aber es wäre auf diese Klasse beschränkt, und der gesamte Rest Ihres Codes könnte frei von allgemeinen Warnungen oder deren Unterdrückung sein.

Quelle
Translate

öffentliche Klasse JSONObject erweitert HashMap implementiert Map, JSONAware, JSONStreamAware

Hat aber keinen Typparameter in der Klassendefinition. Die einzige Option, die Sie haben, ist das Hinzufügen der @ SuppressWarnings ("nicht markiert").

Quelle
Translate

Sie können ein Kartenobjekt erstellen und dann eine explizite Umwandlung in JSONObject durchführen

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

Beachten Sie jedoch, dass Sie dadurch nur "Strings" in Ihren JSON aufnehmen können. und Sie werden Kompilierungsfehler sehen, wenn Sie eine andere Datenstruktur einfügen. Sagen Sie ein Array.

Quelle
Translate

Zu Ihrer Informationorg.codehaus.jettison.json.JSONObjectwird diese Warnung nicht verursachen. Wenn Sie das JSONObject von codehaus verwenden, können Sie auch Analysefehler über abfangenorg.codehaus.jettison.json.JSONException. Sehenhttps://github.com/codehaus/jettisonfür Details.

Quelle
Translate

Eine andere Möglichkeit ist die Initialisierung derJSONObjectmit einem (parametrisiert)Map<String, Object>. Auf diese Weise kann ein Wert von einem beliebigen gültigen JSON-Typ sein, und Sie vermeiden dasuncheckedWarnung. Z.B:

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;
    }
    ...
}
Quelle
Leave a Reply
You must be logged in to post a answer.
Über den Autor