Hübsches Drucken von JSON aus dem ObjectMapper von Jackson 2.2

140

Im Moment habe ich eine Instanz von org.fasterxml.jackson.databind.ObjectMapperund möchte eine Stringmit hübschem JSON bekommen. Alle Ergebnisse meiner Google-Suche haben Jackson 1.x-Methoden ergeben, und ich kann mit 2.2 anscheinend nicht die richtige, nicht veraltete Methode finden. Auch wenn ich nicht glaube, dass Code für diese Frage unbedingt erforderlich 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
Anthony Atkinson
quelle

Antworten:

276

Sie können , indem die hübsche-Druck ermöglichen SerializationFeature.INDENT_OUTPUTauf ObjectMapperwie folgt:

mapper.enable(SerializationFeature.INDENT_OUTPUT);
Gregwhitaker
quelle
1
Ich habe dies auch versucht, aber es scheint, dass SerializationConfiges gelöst ist, aber SerializationConfig.Featurenicht. Dies scheint eine andere Methode des hübschen Druckens zu sein, die ebenfalls veraltet ist, es sei denn, ich vermisse etwas. Es gibt eine FeatureKlasse, die für sich getrennt ist, aber keine INDENT_OUTPUTKonstante im Inneren hat. :(
Anthony Atkinson
Ausgezeichnet! Ich würde gerne wissen, wie du das gefunden hast;)
Anthony Atkinson
1
Ich habe mir eines meiner Projekte angesehen, aber es scheint, dass es auch hier ist: github.com/FasterXML/jackson-databind unter "Häufig verwendete Funktionen"
Gregwhitaker
Der relevante Import, der benötigt wird, ist der Import com.fasterxml.jackson.databind. {SerializationFeature, ObjectMapper}
dgh
2
am 2.2.1 brauchte ich Folgendes: import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable (Feature.INDENT_OUTPUT);
Harschware
46

Laut mkyong besteht die magische Beschwörung darin defaultPrintingWriter, JSON hübsch zu drucken :

Neuere Versionen:

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

Ältere Versionen:

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

Scheint, als hätte ich ein bisschen schnell die Waffe gesprungen. Sie könnten gson ausprobieren , dessen Konstruktor das hübsche Drucken unterstützt :

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

Hoffe das hilft...

hd1
quelle
1
Ich fand diesen Artikel und war enttäuscht, dass dies eine dieser veralteten Arten des hübschen Druckens ist. defaultPrettyPrintingWriter()ist für die ObjectMapperKlasse nicht mehr verfügbar (auch nicht als veraltete Methode) .
Anthony Atkinson
Eigentlich habe ich darüber nachgedacht, aber meine Anwendung ist bereits stark Jackson-orientiert und die gesamte Funktionalität ist tatsächlich vollständig. Der Webanwendungsserver, auf dem dies gehostet wird, wird bereits ziemlich stark besteuert, und ich möchte keine zusätzlichen Bibliotheken laden, nur um Anforderungen und Antworten zu protokollieren. Ich werde Ihre Antwort jedoch auf jeden Fall abstimmen.
Anthony Atkinson
7
@AnthonyAtkinson in Jackson 2.3 gibt es eine MethodeObjectMapper.writerWithDefaultPrettyPrinter()
matt b
36

Die Jackson API hat sich geändert:

new ObjectMapper()
.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(new HashMap<String, Object>());
Rian
quelle
3
Es ist immer noch möglich (mit Jackson 2.7.6) zu verwenden new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());. Sie müssen nur sicherstellen, dass Sie den Writer verwenden, den Sie vom konfigurierten erhalten ObjectMapper.
Martin
3

Das IDENT_OUTPUT hat nichts für mich getan und um eine vollständige Antwort zu geben, die mit meinen Jackson 2.2.3-Gläsern 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 ) );
}
Stan Towianski
quelle
0

Wenn Sie dies standardmäßig für ALLE ObjectMapper-Instanzen in einem Prozess aktivieren möchten, finden Sie 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)
Graham Lea
quelle
0

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

<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>
MohanaRao SV
quelle
0

Wenn andere, die diese Frage anzeigen, nur eine JSON-Zeichenfolge haben (nicht in einem Objekt), können Sie diese in eine Zeichenfolge einfügen HashMapund die Funktion trotzdem ausführen ObjectMapper. Die resultVariable ist Ihre JSON-Zeichenfolge.

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();
} 
Azurespot
quelle
-8

Versuche dies.

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
Wohlfühlen und Programmieren
quelle
13
Das Duplizieren der gewählten Antwort nach 7 Monaten ist nicht wirklich hilfreich.
Igor Rodriguez
1
könnte für jemanden hilfreich sein, wie ich in einer Zeile erwähnt habe, ich fühle mich gut darin, zu teilen, was ich weiß.
Wohlfühlen und Programmieren