wake-up-neo.com

Hübscher Druck von JSON aus dem ObjectMapper von Jackson 2.2

Im Moment habe ich eine Instanz von org.fasterxml.jackson.databind.ObjectMapper und möchte eine String mit hübschem JSON bekommen. Alle Ergebnisse meiner Google-Suchanfragen haben Jackson 1.x dazu gefunden, und ich scheine mit 2.2 nicht die richtige, nicht veraltete Methode zu finden. Auch wenn ich nicht glaube, dass Code für diese Frage absolut notwendig ist, habe ich Folgendes:

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
123

Sie können das hübsche Drucken aktivieren, indem Sie den SerializationFeature.INDENT_OUTPUT in Ihrer ObjectMapper so einstellen:

mapper.enable(SerializationFeature.INDENT_OUTPUT);
241
gregwhitaker

Laut mkyong lautet die Zauberbeschwörung defaultPrintingWriter zu pretty print JSON :

Neuere Versionen:

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

Ältere Versionen:

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

Scheint, ich habe die Waffe schnell gesprungen. Du könntest gson versuchen, dessen Konstruktor das Pretty-Printing unterstützt :

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

Hoffe das hilft...

42
hd1

Die Jackson API hat sich geändert:

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

das IDENT_OUTPUT hat nichts für mich getan, und um eine vollständige Antwort zu geben, die mit meinen Jackson 2.2.3-Dosen funktioniert:

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

wenn Sie eine Kombination aus Feder und Jackson verwenden, können Sie dies wie folgt tun. Ich folge @gregwhitaker wie vorgeschlagen, aber im Frühlingsstil umsetzen.

<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

Wenn Sie dies für ALLE ObjectMapper-Instanzen in einem Prozess standardmäßig aktivieren möchten, haben wir hier einen kleinen Hack, der den Standardwert von INDENT_OUTPUT auf true setzt:

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