2012-08-07 22 views
6

मैं यह सुनिश्चित करना चाहता हूं कि जैक्सन द्वारा जेएसओएन फाइलें कभी भी प्रिंट न हों। मैं एक पूर्व-मौजूदा प्रोजेक्ट पर जूनियर काम कर रहा हूं, इसलिए मुझे जेएसओएन को सुंदर प्रिंट के रूप में आउटपुट करने के लिए कॉन्फ़िगर किया जा सकता है, यह जानने के लिए मुझे पीछे की ओर काम करने की आवश्यकता है। मैं पुष्टि कर सकता हूं कि परियोजना में .defaultPrettyPrintingWriter() के 0 संदर्भ हैं, साथ ही 0setSerializationConfig के 0 संदर्भ, जो मुझे विश्वास है कि सुंदर प्रिंट सक्षम करने के लिए भी उपयोग किया जा सकता है।जैक्सन को सुंदर प्रिंट जेएसओएन आउटपुट से कैसे रोकें?

तो यह और कैसे संभव है? वैकल्पिक रूप से, क्या यह सुनिश्चित करने के लिए एक निश्चित-अग्नि तरीका है कि JSON फ़ाइल सुंदर प्रिंट नहीं है?

+0

क्या आप किसी भी बीन्स या एप्लिकेशन सर्वर का उपयोग कर रहे हैं? आप कॉन्फ़िगरेशन फ़ाइलों में 'prettyPrint' प्रॉपर्टी की जांच कर सकते हैं। –

+0

अपडेट: मुझे उस परियोजना में ऑब्जेक्टमैपर के कई उदाहरण मिले हैं जिन पर मैं काम कर रहा हूं। अगर मैंने आउटपुटMapper.configure (SerializationConfig.Feature.INDENT_OUTPUT, false) जैसे कुछ लिखा है; फिर मुझे गैर-सुंदर प्रिंट JSON मिल जाएगा, मैं ठीक हूँ? – tamuren

+0

* "OutputMapper.configure (SerializationConfig.Feature.INDENT_OUTPUT, झूठा); तो मुझे गैर-सुंदर प्रिंट JSON मिल जाएगा, ठीक है?" ** सिद्धांत रूप में, हाँ, यह ऑब्जेक्टमैपर का वह उदाहरण बनाना चाहिए सुंदर प्रिंट नहीं है। हालांकि ऑब्जेक्ट मैपर बनने के अन्य तरीके भी हो सकते हैं। –

उत्तर

2

MappingJacksonHttpMessageConverte‌​r का उपयोग कर रहे वसंत के किस संस्करण के आधार पर JSON क्रमबद्ध करते समय प्रिंटर को कॉन्फ़िगर करने के लिए prettyPrint नामक एक बूलियन संपत्ति होनी चाहिए।

तो यह एक्सएमएल विन्यास चाल करना चाहिए (आप स्प्रिंग 3 का नवीनतम संस्करण उपयोग कर रहे हैं)

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAda‌​pter"> 
    <property name="messageConverters"> 
    <list> 
     <ref bean="jsonConverter" /> 
    </list> 
    </property> 
</bean> 

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverte‌​r"> 
    <property name="supportedMediaTypes" value="application/json" /> 
    <property name="objectMapper" ref="jacksonObjectMapper" /> 
    <property name="prettyPrint" value="false" /> 
</bean> 

आप GitHub संपत्ति को शुरू करने पर related commit देख सकते हैं। और कक्षा के trunk version भी, जिसमें इस संपत्ति शामिल है। अंत में यह पिछले प्रतिबद्धता से संबंधित वसंत जिरा मुद्दा SPR-7201 है।

या आप एक और अधिक हाल के एक है कि useDefaultPrettyPrinter और setPrettyPrinter तरीके के रूप में सिकंदर Ryzhov ने उल्लेख भी शामिल करने के लिए जैक्सन के अपने संस्करण को अद्यतन करने की कोशिश कर सकते

0

सुनिश्चित नहीं है कि जैक्सन का कौन सा संस्करण आप उपयोग कर रहे हैं लेकिन नवीनतम संस्करण (1.9.10) में, जेसन जेनरेटर का डिफ़ॉल्ट व्यवहार कोई सुंदर प्रिंट नहीं है। इसे चालू करने का सबसे आसान तरीका generator.useDefaultPrettyPrinter() या generator.setPrettyPrinter(new DefaultPrettyPrinter()) पर कॉल करना है। useDefaultPrettyPrinter और setPrettyPrinter के लिए खोज करने का प्रयास करें और उन कथनों को हटा दें।

+0

इस प्रोजेक्ट का उपयोग करने वाला संस्करण 1.3 है। मैंने प्रोजेक्ट की खोज डीफॉल्टप्रेटी प्रिंटर और सेटप्रेटी प्रिंटर के लिए की है, इसका कोई फायदा नहीं हुआ – tamuren

1

सबसे सुरुचिपूर्ण समाधान सुंदर/गैर-सुंदर के लिए स्विच डाल करने के लिए है एक फ़िल्टर में, और स्थैतिक विन्यास वस्तुओं का पुन: उपयोग करें। यह बेकार कचरा संग्रह रोकता है।

/** 
* Evaluate the "pretty" query parameter. If given without any value, or with "true": pretty JSON output. 
* E.g. /test?pretty or /test?pretty=true 
* Otherwise output without any formatting. 
* 
* @see https://stackoverflow.com/questions/10532217/jax-rs-json-pretty-output 
*/ 
@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class RestPrettyJsonFilter implements ContainerResponseFilter { 

    public static final String QUERYPARAM_PRETTY = "pretty"; 

    private static final IndentingModifier INDENTING_MODIFIER_PRETTY = new IndentingModifier(true); 
    private static final IndentingModifier INDENTING_MODIFIER_NOT_PRETTY = new IndentingModifier(false); 

    @Override 
    public void filter(ContainerRequestContext reqCtx, ContainerResponseContext respCtx) throws IOException { 

    boolean pretty = false; 

    UriInfo uriInfo = reqCtx.getUriInfo(); 
    //log.info("prettyFilter: "+uriInfo.getPath()); 

    MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters(); 
    if(queryParameters.containsKey(QUERYPARAM_PRETTY)) { 
     // Pretty query parameter is present 
     String prettyParam = queryParameters.getFirst(QUERYPARAM_PRETTY); 

     // Pretty is present without any value, or value is set to "true"? 
     if (prettyParam == null || "".equals(prettyParam) || "true".equals(prettyParam)) { 
     pretty = true; 
     } 
    } 

    // Prevent recreation of objects over and over again 
    //ObjectWriterInjector.set(new IndentingModifier(pretty)); 
    if (pretty) { 
     ObjectWriterInjector.set(INDENTING_MODIFIER_PRETTY); 
    } else { 
     ObjectWriterInjector.set(INDENTING_MODIFIER_NOT_PRETTY); 
    } 
    } 

    /** 
    * Used to switch on/off pretty output for each response. 
    */ 
    public static class IndentingModifier extends ObjectWriterModifier { 

    private final boolean indent; 

    /** Minimal pretty printer is not printing pretty. */ 
    private final static PrettyPrinter NOT_PRETTY_PRINTER = new com.fasterxml.jackson.core.util.MinimalPrettyPrinter(); 

    public IndentingModifier(boolean indent) { 
     this.indent = indent; 
    } 

    /* (non-Javadoc) 
    * @see com.fasterxml.jackson.jaxrs.cfg.ObjectWriterModifier#modify(com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase, javax.ws.rs.core.MultivaluedMap, java.lang.Object, com.fasterxml.jackson.databind.ObjectWriter, com.fasterxml.jackson.core.JsonGenerator) 
    */ 
    @Override 
    public ObjectWriter modify(EndpointConfigBase<?> endpointConfigBase, MultivaluedMap<String, Object> multivaluedMap, Object o, ObjectWriter objectWriter, JsonGenerator jsonGenerator) throws IOException { 
     if(indent) { 
     // Pretty 
     jsonGenerator.useDefaultPrettyPrinter(); 
     } else { 
     // Not pretty 
     jsonGenerator.setPrettyPrinter(NOT_PRETTY_PRINTER); 
     } 
     return objectWriter; 
    } 
    } 
}