2012-07-19 18 views
6

के साथ मूल आदिम वस्तुओं का क्रमिकरण मुझे निम्नलिखित समस्याओं का सामना करना पड़ रहा है। जब जैक्सन serializer पारित हो जाता है एक क्रमबद्धता के लिए आदिम लिपटे, इस आदिम है के रूप में श्रृंखलाबद्ध है उदाहरण के लिए,:जैक्सन

objectMapper = new ObjectMapper(); 

StringWriter w = new StringWriter(); 
objectMapper.writeValue(w, Integer.valueOf(10)); 
System.out.println(w.toString()); 

आउटपुट के रूप में 10 पैदा करता है। हालांकि 10 मान्य JSON (jsonlint के अनुसार) नहीं है और इसे स्क्वायर ब्रैकेट्स ([10] में लपेटा जाना चाहिए, इसलिए यह एकल-तत्व सरणी होगी) या घुंघराले ब्रैकेट्स ({value:10} में, इसलिए यह डमी प्रॉपर्टी के साथ एक ऑब्जेक्ट होगा) । समस्या संख्याओं को प्रभावित करती है, java.lang.String, java.util.Date, ...

मेरा प्रश्न है: जैक्सन को रैपिंग करने के लिए कैसे बनाया जाए? जैक्सन हमेशा वैध JSON उत्पन्न नहीं करना चाहिए?

मैंने SerializationConfig.Feature.WRAP_ROOT_VALUE सक्षम के साथ जैक्सन व्यवहार का विश्लेषण किया है: यह मेरी अपेक्षा के अनुसार काम नहीं करता है। Primitives अब मान्य JSON ({"Integer":10}) के लिए क्रमबद्ध हैं, लेकिन "सामान्य" जावा बीन्स भी लपेटा जाता है जो {"field":value, ...} के बजाय अवांछित ({"MyBean":{"field":value, ...}}) है।

अगर कोई सलाह दे सकता है कि जैक्सन को कैसे अनुकूलित किया जाए, शायद कस्टम सीरिएलाइज़र के साथ। कठिनाई यह होगी कि बीन आदिम संपत्ति से रूट आदिम रैपर (जिसे लपेटने की जरूरत है) को अलग करना आवश्यक है (लपेटने की आवश्यकता नहीं है)।

कहानी पूरी करने के लिए: जैक्सन serializer वसंत MVC के लिए संदेश कनवर्टर के रूप में प्रयोग किया जाता है, और मुझे शक है यह पुरातन की क्रमबद्धता (जो जैक्सन फोन नहीं होगा रोकना एक हुक लिखने के लिए काफी आसान है, लेकिन बस "[" + String.toString(obj) + "]" वापस आ जाएगी जब आवश्यक)। तो मैं ट्यूनेड जैक्सन के साथ समाधान पसंद करूंगा।

+0

मैं https://github.com/FasterXML/jackson-databind/issues पर एक वृद्धि अनुरोध लॉगिंग करने की अनुशंसा करता हूं –

उत्तर

3

अंत में कस्टम serializer

import java.io.IOException; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.JsonGenerator; 
import org.codehaus.jackson.map.SerializerProvider; 
import org.codehaus.jackson.map.ser.std.ScalarSerializerBase; 

public class NumberSerializer extends ScalarSerializerBase<Number> { 

    protected NumberSerializer() { 
     super(Number.class); 
    } 

    @Override 
    public void serialize(Number value, JsonGenerator jgen, SerializerProvider provider) throws IOException, 
       JsonGenerationException { 
     if (jgen.getOutputContext().inRoot()) { 
      jgen.writeStartArray(); 
      jgen.writeNumber(value.longValue()); 
      jgen.writeEndArray(); 
     } 
     else { 
      jgen.writeNumber(value.longValue()); 
     } 
    } 
} 

मेरे लिए एक काम किया है। सीरिएलाइज़र मॉड्यूल के रूप में पंजीकृत किया जा सकता है (here देखें)।

नोट जब इस seriazlier का उपयोग कर: यह केवल एक तत्व के साथ आदिम विन्यास में, सभी आदिम बदल जाता है, टूट जाता है कि A != desrialize(serialize(A)) जहां A कुछ आदिम है एक अर्थ में प्रतिबिंब सिद्धांत है।