2013-06-01 38 views
18

Tôi có một đối tượng JSON mà tôi đã xây dựng trong chương trình Java của mình.Trình tự của các giá trị có quan trọng trong một đối tượng JSON không?

JSONObject jObj = {"AAA:aaa","BBB:bbb","CCC:ccc"} 

Tôi đang gửi đối tượng này tới máy chủ mà nó mong đợi đối tượng JSON trong loại sau.

{"BBB:bbb", "AAA:aaa", "CCC:ccc"} 

Câu hỏi của tôi là thứ tự của đối tượng JSON thực sự quan trọng ở phía máy chủ? Nếu có, làm thế nào tôi có thể thay đổi thứ tự?

+0

Sự cố bạn đang gặp phải là gì? Bất kỳ lỗi hoặc ngoại lệ nào? –

+3

JSON RFC (RFC 4627) nói rằng thứ tự của các thành viên đối tượng không quan trọng. – fge

+1

Lưu ý về bản thân tương lai khi Google đưa tôi trở lại đây: MongoDB nhạy cảm với thứ tự các phím khi kiểm tra bình đẳng đối tượng. Nếu bạn có tài liệu có _id: {key1: "foo", key2: "bar"}, bạn sẽ không tìm thấy tài liệu với tìm ({_ id: {key2: "bar", key1: "foo"}}). – ahains

Trả lời

24

Câu hỏi của tôi là thứ tự của đối tượng JSON thực sự quan trọng ở phía máy chủ?

không được vấn đề. Theo các thông số kỹ thuật JSON khác nhau, thứ tự của các thuộc tính không đáng kể. Ví dụ:

"Đối tượng là tập hợp các cặp tên/giá trị không theo thứ tự". (Nguồn json.org)

"Một đối tượng là bộ sưu tập không có thứ tự số không hoặc nhiều cặp/giá trị, trong đó tên là chuỗi và giá trị là chuỗi, số, boolean, null, đối tượng hoặc mảng". (Nguồn RFC 7159)

Thật không may, có nitwits ngoài kia người bỏ qua khía cạnh của thông số kỹ thuật, và đặt một số ý nghĩa về thứ tự của các thuộc tính. (Sai lầm thường được thực hiện khi có sự ngắt kết nối giữa những người chỉ định các API và những người thực hiện chúng, và những người làm công việc đặc tả không thực sự hiểu JSON.)

May mắn thay, cơ hội là bất cứ ai được thiết kế/triển khai máy chủ không mắc lỗi đó. Tất cả các trình phân tích cú pháp JSON JSON tôi đã gặp không bảo toàn thứ tự thuộc tính khi phân tích cú pháp ... theo mặc định . Sẽ rất khó để vô tình triển khai máy chủ trong đó thứ tự thuộc tính JSON được phân tích cú pháp là đáng kể.

Nếu có, làm thế nào tôi có thể thay đổi thứ tự?

Với khó khăn, tôi sợ:

  • Bạn có thể tạo ra JSON bằng tay.
  • Có ít nhất một JSON để triển khai java cho phép bạn cung cấp đối tượng Map chứa thuộc tính của đối tượng JSON. Nếu bạn sử dụng một số LinkedHashMap hoặc TreeMap, nó sẽ giữ lại thứ tự chèn hoặc thứ tự từ khóa của các phím thuộc tính.

1 - Ví dụ, nitwits rằng nhà phát triển nghèo này đã làm việc cho ... https://stackoverflow.com/a/4515863/139985

2 - RFC 7159 cũng nói thế này: "JSON thư viện phân tích cú pháp đã được quan sát thấy Việc triển khai có hành vi không phụ thuộc vào thứ tự thành viên sẽ tương thích với nhau theo nghĩa là chúng sẽ không bị ảnh hưởng bởi những khác biệt này. ". Bằng cách đọc của tôi, điều này khuyến nghị rằng thư viện JSON nên ẩn mọi thứ tự của các cặp khỏi mã ứng dụng.

3 - JSON-đơn giản: https://code.google.com/p/json-simple/. Có thể có những người khác nữa.

+0

Cảm ơn thông tin mô tả của bạn. Vâng, đó là lỗi ở phía máy chủ. –

+0

Chỉ để làm cho mọi thứ rõ ràng hơn với người đọc, sẽ rất hữu ích nếu câu trả lời này được cập nhật với trích đoạn từ thông số JSON đề cập đến "thứ tự không quan trọng". –

+0

Đã cập nhật ............ –

9

IMHOkhông thể.

JSON docs nói

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

Vì vậy, đường đi là nhận được các giá trị theo thứ tự yêu cầu, chứ không phải là ra lệnh json

1

Bạn có thể sử dụng danh sách giả định máy chủ của bạn có thể chấp nhận nó:

{"list": [ {"AAA":"aaa"},{"BBB":"bbb"},{"CCC":"ccc"}]} 
-1
public static void jsonpdf() 
{ 
    LinkedHashMap<String,String> lm = new LinkedHashMap<>(); 
    lm.put("BBB","bbb"); 
    lm.put("AAA","aaa"); 
    lm.put("CCC","ccc"); 
    Gson gson = new Gson(); 
    String json = gson.toJson(lm); 
    System.out.println(json); 
} 
0

Trình tự của các lĩnh vực trong một đối tượng JSON có thể thực sự quan trọng. Nó phụ thuộc vào serializer bạn đang sử dụng. Ví dụ, khi bạn tuần tự hóa một đối tượng thừa kế, bạn sẽ nhận được một trường JSON bổ sung được gọi là type = ''. Khi bạn deserialize nó trường kiểu phải đến trước bất kỳ trường JSON nào khác, nếu không nó sẽ đưa vào kiểu của phụ huynh.

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