2012-02-28 30 views
9

Tôi đang cố gắng thay thế một chuỗi JSON (de) tùy chỉnh trong một dự án groovy/grails với Jackson.JSON được tuần tự hóa với các phím được sắp xếp, sử dụng Jackson

Tôi đang gặp sự cố khi đưa Jackson xuất ra một JSON được in đẹp bằng các phím được sắp xếp theo thứ tự chữ cái 'tự nhiên' đơn giản. Tôi đã thử này (và nhiều biến thể):

mymap = [ ... ] // Some groovy map 
def mapper = new ObjectMapper() 
mapper.configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY, true) 
def jsonstring = mapper.defaultPrettyPrintingWriter().writeValueAsString(mymap) 

Nhưng Jackson bướng bỉnh tạo ra một JSON nơi các phím dường như là theo một thứ tự ngẫu nhiên. Tôi đã thử thay đổi loại 'mymap' bằng TreeMap và trong trường hợp đó, tất cả các khóa được sắp xếp đúng như mong đợi.

Tôi tự hỏi nếu có cách nào để nhận các phím được sắp xếp mà không cần thay đổi 'mymap' ở trên thành TreeMap (và đệ quy tất cả giá trị bản đồ của nó ...).

SORT_PROPERTIES_ALPHABETICALLY dường như được dự định để thực hiện chính xác điều đó, nhưng không phải vì lý do nào đó. Bạn có biết tại sao không? Bất cứ điều gì tôi đang làm sai ở trên?

Tôi đã thử với Jackson 1.8.3, 1.8.8 và 1.9.5, cùng một kết quả (khóa ngẫu nhiên).

Trả lời

4

Các documentation cho SORT_PROPERTIES_ALPHABETICALLY dứt khoát nói:

Tính năng định nghĩa thứ tự tuần tự tài sản mặc định sử dụng cho các lĩnh vực POJO (lưu ý: không không áp dụng đối với Bản đồ serialization)

Vì vậy, tôi đoán bạn sẽ cần phải thay đổi Bản đồ đầu vào của mình (như bạn nói)

+0

Điểm tốt, tôi đã bỏ lỡ đó. Có vẻ như tôi có thể phải quên cách thanh lịch đẹp đẽ của việc thiết lập tùy chọn tuần tự hóa. –

+1

Bạn có thể thực hiện: 'def jsonstring = mapper.defaultPrettyPrintingWriter(). WriteValueAsString (mymap as TreeMap)' có thể không? –

+0

Không có điều đó không hữu ích. Việc triển khai 'mymap' không phải là TreeMap. Và ngay cả khi nó đã được, tôi sẽ phải đảm bảo rằng tất cả các giá trị bản đồ khác trong 'mymap' cũng TreeMap, và đó là nơi nó được rất khó khăn. –

1

Như đã chỉ ra, tính năng này chỉ hoạt động đối với POJO. Tuy nhiên, tôi nghĩ rằng có một yêu cầu tính năng để thực hiện tương tự cho Maps, tại Jackson Jira; và nếu không, điều này nghe có vẻ giống như một bổ sung tốt.

Nhưng trong thời gian chờ đợi, tôi sẽ đề nghị sử dụng TreeMap trung gian để sắp xếp, tuần tự hóa: đặt hàng Bản đồ đó sẽ được sử dụng như vậy, vì vậy việc này sẽ hoạt động.

13

Như đã nêu bởi @tim_yates, điều này không hoạt động đối với các khóa bản đồ.

Bạn có thể sử dụng

mapper.configure(SerializationConfig.Feature.ORDER_MAP_ENTRIES_BY_KEYS, true) 
+0

Đối với tôi' JSON_MAPPER.configure (SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true) 'hoạt động tốt và câu trả lời này rất hữu ích :) –

+0

Rất tốt! :-) Có thể tiết kiệm rất nhiều thời gian ;-) – bknopper

+2

Cảm ơn! Trong v2.6.1 nó dường như đã được chuyển đến một gói khác. Điều này làm việc cho tôi: 'mapper.configure (SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);' – Tom

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