java json arraylist type-safety

java - Cómo agregar ArrayList<String> a JSON Array-teniendo en cuenta la seguridad del tipo



type-safety (5)

De la documentación para JSONArray , parece que extends ArrayList al tipo sin JSONArray (no tiene un parámetro de tipo genérico). Este es un ejemplo de cómo lidiar con código heredado no genérico, y la única forma de proceder es asegurarse de que JSONArray esté esperando recibir algunas String y luego suprimir la advertencia.

(La forma real de arreglarlo sería actualizar JSONArray para usar genéricos, pero mientras tanto, debe usar el tipo sin procesar).

Eclipse mostró un tipo de advertencia de seguridad e intenté casi todo para erradicarlo (por supuesto suprimirlo sería una opción), pero desafortunadamente no tuve ningún éxito.
¿Sabes cómo tengo que cambiar mi código para que ya no haya ningún tipo de advertencia de seguridad? ¿O es @SuppressWarnings("unchecked") la única manera?

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

en la última línea se muestra la siguiente advertencia de seguridad:

Tipo de seguridad: el método addAll (Collection) pertenece al tipo sin formato ArrayList. Las referencias al tipo genérico ArrayList deben ser parametrizadas

JSONArray es de org.json.simple.JSONArray . ¿Recomendarías otro paquete?


La respuesta corta para su pregunta es que debe suprimirla para que desaparezca. El problema no está en lo que pones usando el método addAll, sino porque JSONArray no tiene forma de garantizar la seguridad del tipo si no se proporciona el tipo.

JSONArray hereda una ArrayList no parametrizada y el método addAll se define como:

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

Sin proporcionar el parámetro de tipo, E vuelve a Object, lo que hace que el método addAll sea un método que puede agregar una colección que contenga NADA sobre las colecciones existentes. Por lo tanto, puedes hacer algo como esto:

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);

Los perros y los automóviles se agregan juntos al mismo JSONArray (ArrayList) y se tratan como Objeto. Si haces algo como esto, cuando recuperas algo del objeto, no tienes manera de saber si es un perro o un automóvil. Es por eso que la advertencia existe.

Al usar el parámetro de tipo genérico (por ejemplo, Dog), la definición addAll será similar a:

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

Esto asegura que el parámetro solo acepte una colección de clases de perros y perros. Por lo tanto, cuando lo recupere de la colección, es seguro asignarle el objeto de recuperación a Perro.

La advertencia no se debe a que hiciste algo mal. Es debido a que JSONArray hereda una Colección no parametrizada. Siéntase libre de suprimirlo.


Si desea trabajar con json vaya a esta biblioteca, esta biblioteca tiene un buen soporte https://code.google.com/p/google-gson/ .

Esto es un ejemplo:

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]

Gracias


org.json y org.json.simple El analizador JSON usa tipos de colecciones sin formato debajo. Si buscas un buen soporte genérico prueba Google Gson . A continuación, le mostramos cómo haría para serializar su ArrayList genérica con 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);

Así es como deserializarías la misma cadena JSON con sus genéricos intactos:

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


Use la biblioteca Gson para convertir ArrayList en JsonArray .

Gson gson = new GsonBuilder().create(); JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();