如何将ArrayList <string>添加到JSON数组 - 记住类型安全</string>

时间:2013-08-20 12:35:04

标签: java json arraylist type-safety

Eclipse显示了一个类型安全警告,我尝试了几乎所有东西来消除它(当然压制它将是一个选项)但不幸的是我没有任何成功。
你知道我如何更改我的代码,以便不再有类型安全警告。或者@SuppressWarnings("unchecked")是唯一的方式吗?

ArrayList<String> arrayList= (ArrayList<String>) Classname.getArrayList();      
JSONArray obj = new JSONArray();
obj.addAll(arrayList); 
显示以下类型安全警告的最后一行

  

类型安全:    方法addAll(Collection)属于原始类型ArrayList。对泛型类型ArrayList的引用应该是参数化的

JSONArray来自org.json.simple.JSONArray。你会推荐另一个套餐吗?

5 个答案:

答案 0 :(得分:3)

如果您想使用json go这个库,这个库有一个很好的支持https://code.google.com/p/google-gson/

这是一个例子:

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]

由于

答案 1 :(得分:3)

org.json和org.json.simple JSON解析器使用下面的原始类型的集合。如果您正在寻找良好的 Generics 支持,请尝试Google Gson。以下是使用Gson序列化通用ArrayList的方法:

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

以下是如何使用 Generics 完整地反序列化相同的JSON字符串:

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

答案 2 :(得分:1)

你的问题的简短答案是你必须压制它以使它消失。问题不在于您使用addAll方法放置的内容,而是因为如果未提供类型,JSONArray无法保证类型安全。

JSONArray继承非参数化的ArrayList,addAll方法定义为:

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

在不提供类型参数的情况下,E回退到Object,这使得addAll方法成为可以在现有集合之上添加包含ANYTHING的集合的方法。因此,您可以这样做:

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

Dogs和Cars被添加到同一个JSONArray(ArrayList)并被视为几乎没有Object。如果你做这样的事情,当你找回任何一个物体时,你无法分辨它是狗还是汽车。这就是警告存在的原因。

通过使用泛型类型参数(例如Dog),addAll定义将类似于:

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

这确保参数只能接受Dog and Dog的子类集合。因此,当您从集合中检索它时,可以安全地将检索对象分配给Dog。

警告不是因为你做错了什么。这是因为JSONArray继承了非参数化的Collection。随意压制它。

答案 3 :(得分:0)

JSONArray的文档中,它看起来像extends ArrayList原始类型(它没有泛型类型参数)。这是处理非泛型遗留代码的一个示例,唯一的方法是确保JSONArray期望接收一些String然后禁止警告。

(修复它的真正方法是更新JSONArray以使用泛型,但在此期间,您必须使用原始类型。)

答案 4 :(得分:0)

使用Gson库将ArrayList转换为JsonArray

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