JSON a generika v Javě - zadejte bezpečnostní varování

Translate

Mám některá data uložená v prvcích Java a musím je vrátit v daném formátu - JSONObject. I když moje implementace funguje dobře, stále dostávám varovnou zprávu ze zatmění (Verze: Juno Service Release 2):

"Bezpečnost typu: Metoda put (Object, Object) patří do surového typu HashMap. Odkazy na obecný typ HashMap by měly být parametrizovány"

Toto je můj kód:

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

Problematická linie je:obj.put("id",way.getId());

Existuje způsob, jak tento problém vyřešit kromě přidání@SuppressWarnings("unchecked")?

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

Všechny odpovědi

Translate

Jaký je váš JSONObject, dědí z HashMap? Pokud ano, varování pravděpodobně znamená, že byste měli deklarovat instanci JSONObject takto:

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

Aktualizováno: Podívejte se na definici JSONObject:

public class JSONObject extends HashMap

rozšiřuje HashMap, ale nepodporuje typ parametru, pokud je jeho definice

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

pak jsme mohli psát

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

a metoda put již nebude generovat varování

Zdroj
Translate

Pokud nemůžete přepnout do jiné knihovny nebo upravit kód této knihovny tak, aby byl obecný, jedinou další možností by bylo napsat obálku kolem této knihovny, která ji používá a správně podporuje generika.

Takže byste měli svůj vlastníJSONObjecttřída, která by obsahovalaorg.json.simple.JSONObjectby se prodloužiloHashMap<String, Object>a implementovatMap<String, Object>, a bude obsahovat metody předávání pro všechny metody zorg.json.simple.JSONObject.

Stále byste museli dát@SuppressWarnings("unchecked")v této třídě, ale bylo by to omezeno na tuto třídu a veškerý zbytek vašeho kódu by mohl být bez obecných varování nebo jejich potlačení.

Zdroj
Translate

veřejná třída JSONObject rozšiřuje HashMap implementuje Map, JSONAware, JSONStreamAware

Ale nemá parametr typu v definici třídy, jedinou možností, kterou máte, je přidat @SuppressWarnings ("nezaškrtnuto")

Zdroj
Translate

Můžete vytvořit objekt mapy a poté provést explicitní obsazení do JSONObject

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

Tím však omezíte, že do svého JSON zahrnete pouze řetězce. a uvidíte chyby kompilace, pokud vložíte jinou datovou strukturu. Řekněte pole.

Zdroj
Translate

FYIorg.codehaus.jettison.json.JSONObjecttoto varování nezpůsobí. Když používáte codehaus 'JSONObject, máte také možnost zachytit chyby analýzy pomocíorg.codehaus.jettison.json.JSONException. Viděthttps://github.com/codehaus/jettisonpro detaily.

Zdroj
Translate

Další možností je inicializovatJSONObjects (parametrizováno)Map<String, Object>. Tímto způsobem může být hodnota jakéhokoli platného typu JSON a vyhnete seuncheckedVarování. Např:

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;
    }
    ...
}
Zdroj
Leave a Reply
You must be logged in to post a answer.
O autorovi