2013-05-07 10 views
10

Mam niektóre dane przechowywane w elementach Java i muszę zwrócić je w określonym formacie - JSONObject. Podczas gdy moja implementacja działa dobrze, nadal otrzymuję komunikat ostrzegawczy od eclipse (wersja: Juno Service Release 2):JSON i Generics w Javie - ostrzeżenie o typie bezpieczeństwa

"Bezpieczeństwo typu: Metoda put (Object, Object) należy do surowego typu HashMap. do typu rodzajowego HashMap powinny być parametryzowane "

to jest mój kod:

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

problematyczny jest to: obj.put("id",way.getId());

Czy istnieje sposób, aby rozwiązać ten problem wystawić inne, a następnie dodać @SuppressWarnings("unchecked")?

+0

jaki jest typ zwrotu 'getId()'? – SudoRahul

+0

Typ powrotu to: String –

+0

W takim przypadku nie ma problemu z 'obj.put (" id ", way.getId());'. Musi to być jakaś inna linia, która daje to ostrzeżenie! – SudoRahul

Odpowiedz

15

Jaki jest twój JSONObject, czy dziedziczy on z HashMap? Jeśli nastąpi, ostrzec prawdopodobnie oznacza, że ​​należy zadeklarować swoje wystąpienie JSONObject następująco:

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

Aktualizacja: Spójrz na definicji JSONObject:

public class JSONObject extends HashMap 

to rozciąga HashMap ale nie obsługuje parametr typ, jeśli jej definicja jest

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

wtedy moglibyśmy napisać

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

oraz metodę put nie będzie już generować ostrzeżenia

+11

Kiedy próbuję to zrobić, otrzymuję komunikat: "Typ JSONObject nie jest generyczny, nie można go sparametryzować za pomocą argumentów " –

+0

Third party. Możesz go znaleźć tutaj: https://code.google.com/p/json-simple/ –

+17

Odkryłem, że rozszerza HashMap, ale nie ma parametru typu w definicji klasy, więc nie możemy nic zrobić, zamiast dodawać @SuppressWarnings ("niezaznaczone") tutaj ... – ltebean

2

Jeśli nie można przełączyć się do innej biblioteki lub modyfikować kod biblioteki, aby to uniwersalne, jedyna inna opcja byłoby napisać otoki wokół ta biblioteka, która go używa i odpowiednio obsługuje generyczne.

Więc masz swój własny JSONObject klasę, która będzie zawierać się org.json.simple.JSONObject, by przedłużyć HashMap<String, Object> i wdrożenia Map<String, Object> i będzie zawierać metody przekazywania dla wszystkich metod org.json.simple.JSONObject.

Będziesz nadal musiał umieścić @SuppressWarnings("unchecked") w tej klasie, ale będzie to ograniczone do tej klasy, a cała reszta twojego kodu może być wolna od ogólnych ostrzeżeń lub ich zniesienia.

+1

Jeśli nadal potrzebuję używać suppressWarning, nie rozwiązałem problemu, ale przesunąłem to. Na razie wszystkie operacje JSON są wykonywane w jednej klasie, więc nie pomoże mi to zbytnio. Co więcej, muszę zwrócić JSONObject do niektórych metod interfejsu, który implementuję, więc Warping i tak mi to nie pomoże. Wydaje się, że jest to ograniczenie danego pakietu JSON i nie mogę wiele zrobić, aby wyglądało lepiej. –

0

FYI org.codehaus.jettison.json.JSONObject nie spowoduje ostrzeżenia. Podczas korzystania z codehaus 'JSONObject, masz również możliwość złapania błędów parsowania poprzez org.codehaus.jettison.json.JSONException. Aby uzyskać szczegółowe informacje, patrz https://github.com/codehaus/jettison.

0

Można by utworzyć obiekt mapie, a następnie zrobić wyraźne obsady do JSONObject

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

Należy jednak pamiętać, że będzie to ograniczać tylko to „Strings” w JSON. i zobaczysz błędy kompilacji, jeśli wstawisz kolejną strukturę danych. Powiedz tablicę.

+0

w powyższym przypadku nie ma potrzeby dodawania adnotacji "suppress warning" – Kranthi

+0

'java.util.HashMap nie może być rzutowany na org.json.simple.JSONObject' –

0

Inną opcją jest zainicjowanie JSONObject za pomocą (sparametryzowanej) Map<String, Object>. W ten sposób wartością może być dowolny prawidłowy typ JSON, a unikniesz ostrzeżenia unchecked. Na przykład.:

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' nie ma sparametryzowanych konstruktorów. –

+0

@ HarshPandey- Nie używam sparametryzowanego konstruktora 'JSONObject' w mojej odpowiedzi. – asherbar

+0

'JSONObject obj = new JSONObject (forJsonObj);' czy nie używasz sparametryzowanego konstruktora? –