2013-08-20 19 views
9

Eclipse hiển thị cảnh báo an toàn kiểu và tôi đã thử gần như mọi thứ để loại bỏ nó (dĩ nhiên là nó sẽ là một lựa chọn).
Bạn có biết cách tôi phải thay đổi mã của mình để không có cảnh báo an toàn loại nào nữa. Hoặc là @SuppressWarnings("unchecked") cách duy nhất?Làm thế nào để thêm ArrayList <String> vào JSON Array - giữ an toàn kiểu trong tâm trí

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

trong dòng cuối cùng sau cảnh báo an toàn loại được hiển thị:

Loại an toàn: Phương pháp addAll (Bộ sưu tập) thuộc kiểu ArrayList. Tham chiếu đến loại chung ArrayList phải được parametrized

JSONArray là từ org.json.simple.JSONArray. Bạn có đề xuất một gói khác không?

+0

Xin lỗi nhưng không có gì bạn có thể làm vì vấn đề là trong việc triển khai JSONArray, Nó không sử dụng Generics. – Felquir

+0

Bạn có đề xuất sử dụng một triển khai khác của JSONArray không? Nói cách khác để sử dụng một gói khác hơn là 'org.json.simple.JSONArray' hoặc tốt hơn là thêm' @SuppressWarnings ('unchecked') '? – Brenne

+0

Đọc câu trả lời của tôi. – Felquir

Trả lời

2

Nếu bạn muốn làm việc với json đi thư viện này, đây thư viện có hỗ trợ tốt đẹp https://code.google.com/p/google-gson/.

Đây là một ví dụ:

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] 

Cảm ơn

0

Từ tài liệu cho JSONArray, có vẻ như là extends ArrayList loại thô (không có thông số loại chung). Đây là một ví dụ về xử lý mã thừa kế không chung chung và cách duy nhất để tiến hành là đảm bảo rằng JSONArray đang mong nhận được một số String giây và sau đó để chặn cảnh báo.

(Cách thực để sửa chữa nó sẽ được cập nhật JSONArray sử dụng Generics, nhưng trong khi chờ đợi, bạn phải sử dụng các loại nguyên liệu.)

3

org.json và org.json.simple JSON sử dụng phân tích cú pháp các loại nguyên liệu của các bộ sưu tập bên dưới. Nếu bạn đang tìm kiếm tốt Generics hỗ trợ thử Google Gson. Đây là cách bạn sẽ đi về serializing generic ArrayList của bạn với 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); 

Đây là cách bạn sẽ deserialize chuỗi JSON cùng với Generics nó nguyên vẹn:

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

Câu trả lời ngắn cho câu hỏi của bạn là rằng bạn phải ngăn chặn nó để nó biến mất. Vấn đề không phải là về những gì bạn đặt bằng phương thức addAll, đó là vì JSONArray không có cách nào để đảm bảo an toàn loại nếu kiểu không được cung cấp.

JSONArray thừa hưởng một ArrayList phi parametrized và phương pháp addAll được định nghĩa là:

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

Nếu không cung cấp các tham số kiểu, E rơi trở lại vào Object, mà làm cho phương pháp addAll một phương pháp mà có thể thêm một bộ sưu tập chứa ANYTHING ở đầu bộ sưu tập hiện có.Do đó, bạn có thể làm điều gì đó như sau:

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

Chó và xe ô tô được thêm vào cùng một JSONArray (ArrayList) và được coi là đối tượng hiếm khi. Nếu bạn làm một cái gì đó như thế này, khi bạn lấy bất kỳ đối tượng nào trở lại, bạn không có cách nào để nói đó là một con chó hay một chiếc xe hơi. Đây là lý do tại sao cảnh báo tồn tại.

Bằng cách sử dụng các tham số chung loại (ví dụ Dog), định nghĩa addAll sẽ như thế nào:

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

này đảm bảo thông số chỉ có thể chấp nhận một bộ sưu tập của Chó và chó của lớp trẻ. Vì vậy khi bạn lấy nó từ bộ sưu tập, nó là an toàn để gán đối tượng truy xuất cho Dog.

Cảnh báo không phải vì bạn đã làm điều gì đó sai. Đó là vì JSONArray thừa kế một bộ sưu tập không được parametrized. Cảm thấy tự do để ngăn chặn nó.

0

Sử dụng Gson thư viện để chuyển đổi ArrayList thành JsonArray.

Gson gson = new GsonBuilder().create(); 
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray(); 
Các vấn đề liên quan