2012-02-28 15 views
9

का उपयोग करके क्रमबद्ध कुंजी के साथ सीरियलाइज्ड JSON, मैं जैक्सन के साथ एक ग्रोवी/ग्रेल्स प्रोजेक्ट में एक कस्टम 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 जहां कुंजी एक यादृच्छिक क्रम में होने लगते हैं उत्पन्न करता है। मैंने ट्रीमैप के साथ 'mymap' के प्रकार को बदलने का प्रयास किया है, और उस स्थिति में सभी कुंजियों को अपेक्षित रूप से ठीक से क्रमबद्ध किया जाता है।

मैं अगर वहाँ एक रास्ता चाबियाँ बिना अनुसार क्रमबद्ध एक ट्री-मैप (और रिकर्सिवली अपने मानचित्र सभी मान ...) के लिए ऊपर 'mymap की बदलती पाने के लिए है सोच रहा हूँ।

SORT_PROPERTIES_ALPHABETICALLY ठीक से ऐसा करने का इरादा है, लेकिन यह किसी कारण से ऐसा नहीं कर रहा है। क्या आप जानते हैं कि ऐसा क्यों है? मैं कुछ भी गलत कर रहा हूँ?

मैंने जैक्सन 1.8.3, 1.8.8 और 1.9.5, उसी परिणाम (यादृच्छिक कुंजी) के साथ प्रयास किया है।

उत्तर

4

SORT_PROPERTIES_ALPHABETICALLY के लिए documentation स्पष्ट रूप से कहते हैं:

विशेषता यह है कि सामान्य प्रॉपर्टी क्रमबद्धता POJO क्षेत्रों के लिए इस्तेमाल किया क्रम को परिभाषित करता है (ध्यान दें:! क्रमबद्धता मानचित्र पर लागू नहीं होता)

तो मुझे लगता है कि आपको अपना इनपुट मैप बदलना होगा (जैसा कि आप कहते हैं)

+0

अच्छा बिंदु इस्तेमाल कर सकते हैं, मुझे लगता है कि याद किया। ऐसा लगता है कि मुझे केवल क्रमबद्धता वरीयता निर्धारित करने का अच्छा सुरुचिपूर्ण तरीका भूलना पड़ सकता है। –

+1

आपको ऐसा करने में सक्षम होना चाहिए: 'def jsonstring = mapper.defaultPrettyPrintingWriter()। WriteValueAsString (TreeMap के रूप में mymap)' क्या आप नहीं कर सकते? –

+0

नहीं जो मदद नहीं करता है। 'Mymap' का कार्यान्वयन TreeMap नहीं है। और यहां तक ​​कि अगर यह भी था, तो मुझे यह सुनिश्चित करना होगा कि 'mymap' में अन्य सभी मानचित्र मान भी TreeMap हैं, और यही वह जगह है जहां यह बहुत मुश्किल हो जाता है। –

1

जैसा कि बताया गया है, यह सुविधा सिर्फ पीओजेओ के लिए काम करती है। हालांकि, मुझे लगता है कि मैप्स के लिए Jackson Jira पर ऐसा करने का एक सुविधा अनुरोध है; और यदि नहीं, तो यह एक अच्छा जोड़ा की तरह लगता है।

लेकिन इस बीच में मैं दूसरा @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, सत्य) 'बहुत अच्छा काम करता है और यह उत्तर बहुत उपयोगी था :) –

+0

सुनना अच्छा है! :-) बहुत समय बचा सकता है ;-) – bknopper

+2

धन्यवाद! V2.6.1 में ऐसा लगता है कि यह एक अलग पैकेज में स्थानांतरित हो गया है। यह मेरे लिए काम करता है: 'mapper.configure (SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, सत्य); ' – Tom