it-swarm.asia

طباعة جميلة JSON من ObjectMapper جاكسون 2.2

الآن لدي مثيل لـ org.fasterxml.jackson.databind.ObjectMapper وأرغب في الحصول على String مع JSON جميلة. توصلت جميع نتائج عمليات البحث التي أجريتها على Google إلى طرق Jackson 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
126
Anthony Atkinson

يمكنك تمكين الطباعة الجميلة عن طريق تعيين SerializationFeature.INDENT_OUTPUT على ObjectMapper كما يلي:

mapper.enable(SerializationFeature.INDENT_OUTPUT);
248
gregwhitaker

وفقًا لـ mkyong ، فإن التعويذ السحري هو defaultPrintingWriter إلى طباعة جميلة JSON :

الإصدارات الأحدث:

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);

أتمنى أن يساعدك هذا...

44
hd1

تم تغيير واجهة برمجة تطبيقات jackson:

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

لم يفعل IDENT_OUTPUT أي شيء بالنسبة لي ، ولإعطاء إجابة كاملة تعمل مع جراتي jackson 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 ) );
}
3
Stan Towianski

إذا كنت تستخدم مجموعة spring and jackson يمكنك القيام بذلك على النحو التالي. أتابع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
MohanaRao SV

إذا كنت ترغب في تشغيل هذا افتراضيًا لمثيلات ALL ObjectMapper في عملية ما ، فإليك بعض الاختراقات التي ستقوم بتعيين القيمة الافتراضية لـ INDENT_OUTPUT إلى true:

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