जैक्सन 2.2 के ObjectMapper से सुंदर मुद्रण JSON


141

अभी मेरे पास एक उदाहरण है org.fasterxml.jackson.databind.ObjectMapperऔर मैं एक Stringसुंदर JSON प्राप्त करना चाहता हूं । मेरी Google खोजों के सभी परिणाम जैक्सन के ऐसा करने के 1.x तरीके हैं और मुझे 2.2 के साथ ऐसा करने का उचित, गैर-अस्वीकृत तरीका नहीं मिल सकता है। भले ही मुझे विश्वास न हो कि इस प्रश्न के लिए कोड आवश्यक है, यहाँ मेरे पास अभी क्या है:

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
System.out.println("\n\n----------REQUEST-----------");
StringWriter sw = new StringWriter();
mapper.writeValue(sw, jsonObject);
// Want pretty version of sw.toString() here

जवाबों:


277

आप SerializationFeature.INDENT_OUTPUTअपनी ObjectMapperपसंद के अनुसार सेट करके सुंदर प्रिंटिंग को सक्षम कर सकते हैं :

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
मैंने भी यह कोशिश की है लेकिन ऐसा लगता है कि SerializationConfigहल हो गया है लेकिन SerializationConfig.Featureनहीं है। यह सुंदर मुद्रण की एक और विधि प्रतीत होती है, जिसे तब तक हटा दिया जाता है जब तक कि मुझे कुछ याद न हो। एक Featureवर्ग है जो अपने दम पर अलग हो गया है, लेकिन INDENT_OUTPUTअंदर एक निरंतरता नहीं है । :(
एंथनी एटकिंसन

अति उत्कृष्ट! मुझे यह जानकर बहुत अच्छा लगा कि आपने कैसे पाया;)
एंथनी एटकिंसन

1
मैंने अपनी परियोजनाओं में से एक को देखा, लेकिन ऐसा प्रतीत होता है कि यह यहां भी है: github.com/FasterXML/jackson-databind "सामान्य रूप से उपयोग की जाने वाली विशेषताएं" के तहत
gregwhitaker

प्रासंगिक आयात की आवश्यकता आयात com.fasterxml.jackson.databind है। {SerializationFeature,
ObjectMapper

2
2.2.1 पर यह मेरे लिए क्या है: आयात org.codehaus.jackson.map.SerializationConfig.Fureure; mapper.enable (Feature.INDENT_OUTPUT);
harschware

46

मैन्कॉन्ग के अनुसार , जादू की छँटाई जेन्सdefaultPrintingWriter को प्रिंट करने के लिए की जाती है :

नए संस्करण:

System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonInstance));

पुराने संस्करण:

System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonInstance));

लगता है मैंने बंदूक को जल्दी से उछाल दिया। आप gson की कोशिश कर सकते हैं , जिसका निर्माता सुंदर छपाई का समर्थन करता है :

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);

उम्मीद है की यह मदद करेगा...


1
मैंने इस लेख को पाया और यह जानकर निराश हुआ कि यह सुंदर मुद्रण के उन उपेक्षित तरीकों में से एक है। वर्ग defaultPrettyPrintingWriter()पर अब उपलब्ध नहीं है (एक पदावनत विधि के रूप में भी) ObjectMapper
एंथनी एटकिंसन

मैं वास्तव में ऐसा करने के बारे में सोच रहा था, लेकिन मेरा आवेदन पहले से ही भारी जैक्सन-उन्मुख है और सभी कार्यक्षमता वास्तव में पूरी हो गई है। वेब एप्लिकेशन सर्वर जिस पर यह होस्ट किया जाएगा, उस पर पहले से ही बहुत भारी कर लगाया जा रहा है, और मैं केवल अनुरोधों और प्रतिक्रियाओं के लिए अतिरिक्त पुस्तकालयों को लोड नहीं करना चाहूंगा। मैं आपके जवाब को निश्चित रूप से अप-वोट करूंगा।
एंथनी एटकिंसन

7
ObjectMapper.writerWithDefaultPrettyPrinter()
मैट बी

36

जैकसन एपीआई बदल गया है:

new ObjectMapper()
.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(new HashMap<String, Object>());

3
यह अभी भी संभव है (जैक्सन 2.7.6 के साथ) उपयोग करने के लिए new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());। आपको बस कॉन्फ़िगर से प्राप्त लेखक का उपयोग करना सुनिश्चित करना होगा ObjectMapper
मार्टिन

3

IDENT_OUTPUT ने मेरे लिए कुछ नहीं किया, और एक पूर्ण उत्तर देने के लिए जो मेरे जैकसन 2.2.3 जार के साथ काम करता है:

public static void main(String[] args) throws IOException {

byte[] jsonBytes = Files.readAllBytes(Paths.get("C:\\data\\testfiles\\single-line.json"));

ObjectMapper objectMapper = new ObjectMapper();

Object json = objectMapper.readValue( jsonBytes, Object.class );

System.out.println( objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString( json ) );
}

0

यदि आप किसी प्रक्रिया में सभी ObjectMapper उदाहरणों के लिए डिफ़ॉल्ट रूप से इसे चालू करना चाहते हैं, तो यहां एक छोटी सी हैक है जो INDENT_OUTPUT के डिफ़ॉल्ट मान को सही करेगी:

val indentOutput = SerializationFeature.INDENT_OUTPUT
val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState")
defaultStateField.setAccessible(true)
defaultStateField.set(indentOutput, true)

0

यदि आप वसंत और जैक्सन संयोजन का उपयोग कर रहे हैं, तो आप इसे निम्नानुसार कर सकते हैं। जैसा कि सुझाव दिया गया है लेकिन वसंत शैली में लागू करने के लिए मैं @gregwhitaker का अनुसरण कर रहा हूं।

<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
    <property name="dateFormat">
        <bean class="java.text.SimpleDateFormat">
            <constructor-arg value="yyyy-MM-dd" />
            <property name="lenient" value="false" />
        </bean>
    </property>
    <property name="serializationInclusion">
        <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">
            NON_NULL
        </value>
    </property>
</bean>

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <ref bean="objectMapper" />
    </property>
    <property name="targetMethod">
        <value>enable</value>
    </property>
    <property name="arguments">
        <value type="com.fasterxml.jackson.databind.SerializationFeature">
            INDENT_OUTPUT
        </value>
    </property>
</bean>

0

यदि अन्य लोग जो इस प्रश्न को देखते हैं, उनके पास केवल JSON स्ट्रिंग (ऑब्जेक्ट में नहीं) है, तो आप इसे एक में डाल सकते हैं HashMapऔर फिर भी ObjectMapperकाम कर सकते हैं। resultचर अपने JSON स्ट्रिंग है।

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;

// Pretty-print the JSON result
try {
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> response = objectMapper.readValue(result, HashMap.class);
    System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response));
} catch (JsonParseException e) {
    e.printStackTrace();
} catch (JsonMappingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} 

-8

इसे इस्तेमाल करे।

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);

13
7 महीनों के बाद चुने गए उत्तर की नकल करना वास्तव में मददगार नहीं है।
इगोर रोड्रिगेज

1
कुछ के लिए उपयोगी हो सकता है जैसा कि मैंने एक पंक्ति में उल्लेख किया है, मैं जो कुछ भी जानता हूं उसे साझा करने में अच्छा महसूस करता हूं।
अच्छा लग रहा है और
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.