2011-09-24 37 views
20

Tôi cần triển khai thực hiện tuần tự hóa JSON cho một số đối tượng và tôi đã gặp sự cố khi tích hợp với các bộ sưu tập chung.Tuần tự hóa JSON JSON - thực hành tốt nhất

Tất cả các lớp serializable thực hiện giao diện này (JSONObject đến từ this thư viện):

interface JSONSerializable{ 
    public JSONObject dump() throws JSONException //serializes object 
    public void load(JSONObject obj) throws JSONException //deserializes object 
} 

Mã cho bộ sưu tập của tôi dựa trên java.util.List trông nhiều hơn hoặc ít hơn như thế này:

class AwesomeList<T extends JSONSerializable> implements JSONSerializable{ 
    private LinkedList<T> items = new LinkedList<T>(); 
    ... 
    ... 

    public JSONObject dump() throws JSONException { 
     JSONObject result = new JSONObject(); 
     JSONArray a = new JSONArray(); 
     for(T i : items){ 
      a.put(i.dump()); 
     } 
     result.put("items", a); 
     return result; 
    } 

    public void load(JSONObject obj) throws JSONException{ 
     //here is my problem 
    } 
} 

Vấn đề của tôi là: Khi tôi tải AwesomeList từ JSONObject, tôi cần tạo các phần tử của nó nhưng không thể vì java cấm tôi viết

T newItem = new T(); 
newItem.load(obj); 

Tôi nên sửa đổi cách tiếp cận của mình đối với tác vụ này như thế nào?

+0

Thành thật mà nói tôi không thấy cách làm việc này với thậm chí biết loại. Bạn có lưu trữ tên lớp trong gói dữ liệu JSON không? – Perception

+0

Không, mọi đối tượng đều biết cách tải chính nó từ JSONObject (thực ra chỉ là mảng kết hợp). Tôi đã cập nhật bài đăng để hiển thị những gì tôi muốn làm. – KCH

Trả lời

30

Bạn có bị ràng buộc với thư viện này không? Google Gson rất phổ biến. Tôi có bản thân mình không sử dụng nó với Generics nhưng trang đầu của họ nói Gson coi hỗ trợ cho Generics rất quan trọng.

+2

gson có thể xử lý generics rất tốt. – kingori

+3

thời gian qua tôi đã kiểm tra gson không xử lý tài liệu tham khảo vòng tròn .. mặc dù một bản cập nhật có thể đã cố định rằng .. tôi tìm thấy [link] http://jackson.codehaus.org/ là tốt nhất. Kiểm tra câu hỏi này của tôi về cách chuyển đổi json với generic trong gson [link] http://stackoverflow.com/questions/5528385/json-conversion-using-gson –

+0

Việc sử dụng GSON rất, rất, rất đơn giản. – schmijos

0

Vâng, khi ghi nó ra tệp, bạn biết lớp T là gì, vì vậy bạn có thể lưu trữ số đó trong dump. Sau đó, khi đọc nó trở lại, bạn có thể tự động gọi nó bằng cách sử dụng sự phản chiếu.

public JSONObject dump() throws JSONException { 
    JSONObject result = new JSONObject(); 
    JSONArray a = new JSONArray(); 
    for(T i : items){ 
     a.put(i.dump()); 
     // inside this i.dump(), store "class-name" 
    } 
    result.put("items", a); 
    return result; 
} 

public void load(JSONObject obj) throws JSONException { 
    JSONArray arrayItems = obj.getJSONArray("items"); 
    for (int i = 0; i < arrayItems.length(); i++) { 
     JSONObject item = arrayItems.getJSONObject(i); 
     String className = item.getString("class-name"); 
     try { 
      Class<?> clazzy = Class.forName(className); 
      T newItem = (T) clazzy.newInstance(); 
      newItem.load(obj); 
      items.add(newItem); 
     } catch (InstantiationException e) { 
      // whatever 
     } catch (IllegalAccessException e) { 
      // whatever 
     } catch (ClassNotFoundException e) { 
      // whatever 
     } 
    } 
4

Như những người khác đã gợi ý, bạn nên cân nhắc việc bán phá giá thư viện của org.json. Nó khá nhiều lỗi thời ngày nay, và cố gắng giải quyết các vấn đề của nó là lãng phí thời gian.

Nhưng đối với câu hỏi cụ thể; loại biến T chỉ không có bất kỳ thông tin nào để giúp bạn, vì nó ít hơn thông tin biên dịch thời gian. Thay vào đó, bạn cần phải vượt qua lớp thực tế (như đối số 'lớp cls'), và sau đó bạn có thể tạo một cá thể với 'cls.newInstance()'.

0

Bạn đã thử json-io (https://github.com/jdereg/json-io) chưa?

Thư viện này cho phép bạn tuần tự hóa/deserialize bất kỳ đồ thị đối tượng Java, bao gồm đồ thị đối tượng với chu kỳ trong đó (ví dụ, A-> B, B-> A). Nó không yêu cầu các lớp của bạn thực hiện bất kỳ giao diện cụ thể nào hoặc kế thừa từ bất kỳ lớp Java cụ thể nào.

Ngoài serialization của Java để JSON (và JSON để Java), bạn có thể sử dụng nó để định dạng (in đẹp) JSON:

String niceFormattedJson = JsonWriter.formatJson(jsonString) 
Các vấn đề liên quan