2013-08-20 7 views
9

Eclipse wyświetliło ostrzeżenie o bezpieczeństwie typu i próbowałem prawie wszystkiego, aby go wykorzenić (oczywiście tłumiąc, że byłoby to możliwe), ale niestety nie odniosłem żadnego sukcesu.
Czy wiesz, jak zmienić kod, aby nie było już żadnego ostrzeżenia o typie. Czy jest to jedyny sposób, aby uzyskać @SuppressWarnings("unchecked")? WyświetlaneJak dodać ArrayList <String> do JSON Array - pamiętając o bezpieczeństwie typu

ArrayList<String> arrayList= (ArrayList<String>) Classname.getArrayList();  
JSONArray obj = new JSONArray(); 
obj.addAll(arrayList); 

w ostatnim wierszu poniższej typu ostrzeżenia bezpieczeństwa jest:

Typ bezpieczeństwa: Sposób AddAll (Collection) należący do surowego typu ArrayList. Odniesienia do ogólnego typu ArrayList powinny być sparametryzowane:

JSONArray pochodzi z org.json.simple.JSONArray. Czy poleciłbyś inną paczkę?

+0

Przepraszam, ale nic nie można zrobić, ponieważ problem polega na implementacji JSONArray, to nie używa generycznych. – Felquir

+0

Czy poleciłbyś zastosować inną implementację JSONArray? Innymi słowy, aby użyć innego pakietu niż 'org.json.simple.JSONArray' lub lepiej dodać' @SuppressWarnings ('niezaznaczone') '? – Brenne

+0

Przeczytaj moją odpowiedź, proszę. – Felquir

Odpowiedz

2

Jeśli chcesz pracować z JSON przejść tej biblioteki, to biblioteka ma dobrą obsługę https://code.google.com/p/google-gson/.

To jest przykład:

Gson gson = new Gson(); 
Collection<Integer> ints = Lists.immutableList(1,2,3,4,5); 

(Serialization) 
String json = gson.toJson(ints); ==> json is [1,2,3,4,5] 

Dzięki

0

Z dokumentacji dla JSONArray, wygląda na to, że jest to extends ArrayList typ surowy (nie ma parametru typu ogólnego). Jest to przykład radzenia sobie z nie generycznym starym kodem, a jedynym sposobem postępowania jest upewnienie się, że JSONArray spodziewa się otrzymać jakieś String s, a następnie wyłączyć ostrzeżenie.

(Prawdziwym sposobem rozwiązania byłoby zaktualizować JSONArray użyć rodzajowych, ale w międzyczasie trzeba użyć surowego typ.)

3

org.json i org.json.simple parser JSON stosowanie surowych rodzaje zbiorów pod spodem. Jeśli szukasz dobrej usługi Generics, spróbuj Google Gson. Oto w jaki sposób możesz przejść o szeregowania swojej rodzajowe ArrayList z Gson:

Gson gson = new Gson(); 

ArrayList<String> arrayList= (ArrayList<String>) ClassName.getArrayList(); 

// Serializing to a JSON element node 
JsonElement jsonElement = gson.toJsonTree(arrayList); 
System.out.println(jsonElement.isJsonArray()); // true 

// Or, directly to JSON string 
String json = gson.toJson(arrayList); 
System.out.println(json); 

oto jak byś deserializowania ten sam ciąg JSON z jego Generics nienaruszonych:

Type type = new TypeToken<ArrayList<String>>(){}.getType(); 
ArrayList<String> arrayList = gson.fromJson(json, type); 
1

Krótka odpowiedź na Twoje pytanie jest że musicie go stłumić, aby odszedł. Problem nie dotyczy tego, co wstawiasz za pomocą metody addAll, ponieważ JSONArray nie ma możliwości zagwarantowania bezpieczeństwa typu, jeśli typ nie jest dostarczony.

JSONArray dziedziczy nie sparametryzowanego ArrayList i sposób AddAll jest zdefiniowany jako:

public boolean addAll(java.util.Collection<? extends E> es) 

bez stosowania parametru typu E wraca do obiektu, co sprawia, że ​​sposób AddAll sposobu, który można dodać do zbierania która zawiera WSZYSTKO na górze istniejących kolekcji.W związku z tym można zrobić coś takiego:

List<Dog> dogs = new ArrayList<Dog>(); 
dogs.add(new Chiwawa()); 

List<Car> cars = new ArrayList<Car>(); 
cars.add(new BMW()); 

JSONArray jsonArray = new JSONArray(); 
jsonArray.addAll(dogs); 
jsonArray.addAll(cars); 

psy i samochody są sumowane do tej samej JSONArray (ArrayList) i traktowano jak ledwo obiektu. Jeśli zrobisz coś takiego, gdy odzyskasz dowolny przedmiot, nie będziesz w stanie stwierdzić, czy to pies, czy samochód. Dlatego istnieje ostrzeżenie.

Wykorzystując parametr typu rodzajowego (np pies), definicja AddAll będzie jak:

public boolean addAll(java.util.Collection<? extends Dog> es) 

to upewnij się, że parametr może przyjąć tylko zbiór psa i pies w klasie podrzędnej. Dlatego po pobraniu go z kolekcji można bezpiecznie przypisać obiekt do pobrania do Dog.

Ostrzeżenie nie jest spowodowane tym, że zrobiłeś coś złego. Dzieje się tak, ponieważ JSONArray dziedziczy kolekcję nieparametryzowaną. Nie krępuj się.

0

Użyj biblioteki o nazwie ArrayList do konwersji ArrayList na JsonArray.

Gson gson = new GsonBuilder().create(); 
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray(); 
Powiązane problemy