2011-08-13 17 views
22

Tôi có một phản hồi rất lớn từ máy chủ chuỗi JSON. Tôi đã chuyển đổi nó thành đối tượng JSON và sau đó lấy các khóa và lặp lại nó.Khi các khóa của JsonObject được lặp lại, chúng không theo thứ tự như trong phản hồi từ máy chủ

Vấn đề là khi tôi lặp lại nó không theo thứ tự như trong phản hồi từ máy chủ.

Tiếp theo, tôi áp dụng một phương pháp khác bằng cách thêm tất cả các khóa trong List<String> và sắp xếp nó rồi lấy trình lặp đó nhưng vẫn không phải như tôi yêu cầu (như phản hồi).

Mã ví dụ là ở đây:

JSONObject jsonObject = new JSONObject(responseString); 
    Iterator<String> myIter = jsonObject.keys(); 


    List<String> sortKey = new ArrayList<String>(); 

    while(myIter.hasNext()){ 
     sortKey.add(myIter.next()); 
    } 
    Collections.sort(sortKey); 

Trả lời

18

Thứ tự của các phím của một đối tượng JSON không được coi là có ý nghĩa. Nếu bạn muốn một thứ tự cụ thể, bạn nên sử dụng một mảng, không phải là một đối tượng.

Mã Java của bạn sắp xếp các phím theo thứ tự abc. Không có cách nào để có được thứ tự ban đầu của các phím trong đối tượng.

Reference 1:

Thứ tự của các phím là undefined

Reference 2:

Một đối tượng là một hổn độn của các cặp tên/giá trị

+0

Cảm ơn người đàn ông nhưng hãy xem câu hỏi tiếp theo ngay bây giờ. http://stackoverflow.com/questions/7053915/how-to-parse-a-jsonobject-using-jsonarray-that-have-dynamic-ids-in-start-as-inte – mastermind

+3

Thành thật mà nói tôi không nghĩ câu trả lời này là đúng 100%. Ví dụ, đối với mảng trao đổi tiền tệ, nó có thể là cặp {name -> info} và tên có thể được sắp xếp theo mức độ "quan trọng", nghĩa là USD là số 1, vv. Tất nhiên bạn có thể đặt paris này thành các mục mảng, nhưng sau đó chỉ có một tổ bổ sung. Quan điểm của tôi là có thể có nhiều lý do tốt cho thứ tự các mục trong một đối tượng "từ điển" có ý nghĩa. Nếu nó không phải là một phần của thông số kỹ thuật json, thì thông số là sai, không phải mọi người muốn giữ cấu trúc dữ liệu của họ càng sạch sẽ và đơn giản càng tốt. –

+0

@ superarts.org: câu hỏi không phải là liệu các phím của đối tượng JavaScript * có nên được đặt hàng hay không. Câu hỏi đặt ra là các phím của một đối tượng JavaScript * được sắp xếp. Và họ không. –

17

Bạn có thể dùng Sắp xếp bản đồ để đặt khóa và giá trị vào. Một cái gì đó như thế này

public static List listFromJsonSorted(JSONObject json) { 
    if (json == null) return null; 
    SortedMap map = new TreeMap(); 
    Iterator i = json.keys(); 
    while (i.hasNext()) { 
     try { 
      String key = i.next().toString(); 
      JSONObject j = json.getJSONObject(key); 
      map.put(key, j); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    return new LinkedList(map.values()); 
} 
0

Tôi gặp vấn đề tương tự khi làm việc trên phần trong ứng dụng Android của tôi hiển thị danh sách 1024 trang web theo thứ tự abc. Vì quá trình truyền tải json không theo thứ tự sắp xếp, tôi chỉ chèn các giá trị json trong quá trình truyền vào bảng (tôi đang sử dụng bộ điều hợp danh sách trong ứng dụng của mình) và thu được danh sách các trang web được sắp xếp bằng con trỏ.

Vì vậy, nếu bạn đang lưu những gì bạn đang tìm nạp từ máy chủ, bạn chỉ có thể truy vấn cơ sở dữ liệu của bạn để sắp xếp các giá trị theo thứ tự bạn muốn.

+0

có điều đầu tiên đến trong tâm trí mà bạn nói nhưng nó chắc chắn sẽ mất thời gian nhưng tôi đang tìm kiếm để sắp xếp thông qua các hàm json và java –

Các vấn đề liên quan