簡體   English   中英

如何添加ArrayList <String> JSON數組-牢記類型安全

[英]How to add ArrayList<String> to JSON Array - keeping type safety in mind

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 您會推薦其他套餐嗎?

如果您想使用json,請轉到該庫,該庫具有很好的支持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]

謝謝

org.json和org.json.simple JSON解析器使用下面的原始集合類型。 如果您正在尋找良好的泛型支持,請嘗試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);

這是在完整的泛型下反序列化相同JSON字符串的方法:

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

對於您的問題的簡短回答是,您必須抑制它才能消失。 問題不在於您使用addAll方法放置的內容,這是因為如果未提供type,則JSONArray無法保證類型安全。

JSONArray繼承非參數化的ArrayList,並將addAll方法定義為:

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

在不提供type參數的情況下,E退回到Object,這使addAll方法成為一種可以在現有集合的頂部添加包含任何內容的集合的方法。 因此,您可以執行以下操作:

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

狗和汽車被添加到同一JSONArray(ArrayList)中,並被視為對象。 如果執行這樣的操作,則在取回任何對象時,您將無法分辨它是狗還是汽車。 這就是警告存在的原因。

通過使用通用類型參數(例如Dog),addAll定義將類似於:

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

這樣可以確保該參數只能接受Dog和Dog的子類的集合。 因此,當您從集合中檢索它時,將檢索對象分配給Dog是安全的。

警告不是因為您做錯了什么。 這是因為JSONArray繼承了非參數化的Collection。 隨時抑制它。

JSONArray的文檔中,它似乎extends ArrayList的原始類型(它沒有通用類型參數)。 這是處理非通用遺留代碼的示例,唯一的進行方法是確保JSONArray期望接收某些String ,然后禁止顯示警告。

(解決此問題的真正方法是將JSONArray更新為使用泛型,但與此同時,您必須使用原始類型。)

使用Gson庫將ArrayList轉換為JsonArray

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM