2012-02-28 3 views
9

groovy/grails 프로젝트의 사용자 정의 JSON (de) 직렬화를 Jackson으로 바꾸려고합니다.Jackson을 사용하여 정렬 된 키가있는 직렬화 된 JSON

간단한 '자연스러운'알파벳 순서로 정렬 된 키가있는 예쁜 인쇄 JSON을 출력하는 데 문제가 있습니다. 이 시도 (많은 변화)했습니다

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

그러나 잭슨은 고집 키가 임의의 순서로 보인다 JSON을 생성합니다. TreeMap을 사용하여 'mymap'유형을 변경해 보았습니다.이 경우 모든 키가 예상대로 올바르게 정렬됩니다.

위의없이 'mymap'을 TreeMap (및 재귀 적으로 모든 맵 값 ...)으로 변경하지 않고 키를 가져 오는 방법이 있다면 이 궁금합니다.

SORT_PROPERTIES_ALPHABETICALLY은 (는) 정확하게 수행하려고 의도 된 것 같지만 어떤 이유로 든 수행하지 않습니다. 그 이유를 아시겠습니까? 위의 무엇을 잘못하고 있습니까?

잭슨 1.8.3, 1.8.8 및 1.9.5와 동일한 결과 (임의 키)를 시도했습니다.

답변

4

SORT_PROPERTIES_ALPHABETICALLYdocumentation 명시 적으로 말한다 : (! : 직렬화지도에는 적용되지 않습니다)

그래서 제 생각 엔 POJO 필드에 사용되는 기본 속성 직렬화 순서를 정의

기능 입력 맵을 변경해야합니다 (말한대로)

+0

좋은 포인트를 사용할 수 있습니다. 직렬화 환경을 설정하는 좋은 방법을 잊어 버린 것처럼 보입니다. –

+1

당신은 할 수 있어야합니다 :'def jsonstring = mapper.defaultPrettyPrintingWriter(). writeValueAsString (mymap as TreeMap)'안 그래? –

+0

그게 도움이되지 않습니다. 'mymap'의 구현은 TreeMap이 아닙니다. 그리고 그것이 있었다면, 'mymap'의 다른 모든 맵 값도 TreeMap인지 확인해야합니다. 그리드 매핑이 매우 까다로워집니다. –

1

이 기능은 POJO에서 작동합니다. 그러나지도에 대해 동일한 작업을 수행 할 기능 요청이 있다고 생각합니다 (Jackson Jira). 그렇지 않은 경우에는 좋은 추가 소리가 들립니다.

하지만 중간에 TreeMap을 사용하여 정렬을 위해 두 번째 @tim_yates 제안을합니다. 즉,이 순서는 해당 순서대로 사용되므로 순서대로 사용해야합니다.

13

@tim_yates에서 설명한대로 맵 키에는 작동하지 않습니다.

당신은 내가 그 놓친,

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

JSON_MAPPER.configure (SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true)'는 훌륭하게 작동합니다.이 대답은 매우 유용했습니다 :) –

+0

잘 들어요! :-) 많은 시간을 절약 할 수 있습니다 ;-) – bknopper

+2

고마워요! v2.6.1에서는 다른 패키지로 이동 한 것 같습니다. 이것은 나를 위해 일했다 :'mapper.configure (SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);' – Tom

관련 문제