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

Lesezeit: 4 Minuten

Im Moment habe ich eine Instanz von org.fasterxml.jackson.databind.ObjectMapper und möchte eine bekommen String mit hübschem JSON. Alle Ergebnisse meiner Google-Suche haben Jackson 1.x-Möglichkeiten ergeben, und ich kann anscheinend nicht die richtige, nicht veraltete Methode finden, dies mit 2.2 zu tun. Auch wenn ich nicht glaube, dass Code für diese Frage unbedingt notwendig ist, habe ich gerade 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

Benutzer-Avatar
gregwhitaker

Sie können Pretty-Printing aktivieren, indem Sie die SerializationFeature.INDENT_OUTPUT auf Ihrem ObjectMapper so:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

  • Ich habe das auch versucht, aber es scheint so SerializationConfig ist aber gelöst SerializationConfig.Feature ist nicht. Dies scheint eine weitere Methode des hübschen Druckens zu sein, die ebenfalls veraltet ist, es sei denn, ich vermisse etwas. Da ist ein Feature Klasse, die für sich allein steht, aber keine hat INDENT_OUTPUT ständig drinnen. 🙁

    – Anthony Atkinson

    12. Juli 2013 um 15:02 Uhr

  • Exzellent! Ich würde gerne wissen, wie du das findest 😉

    – Anthony Atkinson

    12. Juli 2013 um 15:15 Uhr

  • 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

    12. Juli 2013 um 15:18 Uhr

  • Der relevante benötigte Import ist import com.fasterxml.jackson.databind. {SerializationFeature, ObjectMapper}

    – dgh

    26. August 2013 um 6:49 Uhr

  • Auf 2.2.1 habe ich Folgendes benötigt: import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable (Feature.INDENT_OUTPUT);

    – Harschware

    16. Dezember 2013 um 20:31 Uhr


Benutzer-Avatar
hd1

Entsprechend mkyongist die magische Beschwörung defaultPrintingWriter zu hübscher Druck JSON:

Neuere Versionen:

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

Ältere Versionen:

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

Scheint, ich sprang die Waffe ein bisschen schnell. Du könntest es versuchen gsonDeren Der Konstruktor unterstützt das hübsche Drucken:

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

Hoffe das hilft…

  • Ich habe diesen Artikel gefunden und musste enttäuscht feststellen, dass dies eine dieser veralteten Methoden des hübschen Druckens ist. defaultPrettyPrintingWriter() ist nicht mehr verfügbar (selbst als veraltete Methode) auf der ObjectMapper Klasse.

    – Anthony Atkinson

    12. Juli 2013 um 14:39 Uhr

  • Ich habe eigentlich darüber nachgedacht, aber meine Anwendung ist bereits stark Jackson-orientiert und die gesamte Funktionalität ist eigentlich 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 definitiv positiv bewerten.

    – Anthony Atkinson

    12. Juli 2013 um 14:59 Uhr

  • @AnthonyAtkinson in Jackson 2.3 gibt es eine Methode ObjectMapper.writerWithDefaultPrettyPrinter()

    – matt b

    21. Januar 2014 um 22:41 Uhr

Die Jackson-API hat sich geändert:

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

  • 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 von der konfigurierten erhalten ObjectMapper.

    – Martin

    11. Juli 2017 um 14:04 Uhr

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

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)

Benutzer-Avatar
Mohana Rao SV

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.

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

Benutzer-Avatar
Azurespot

Wenn andere, die diese Frage sehen, nur eine JSON-Zeichenfolge haben (nicht in einem Objekt), können Sie sie in eine einfügen HashMap und bekomme die noch ObjectMapper arbeiten. Das result Variable 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();
} 

1345660cookie-checkHübsches Drucken von JSON aus dem ObjectMapper von Jackson 2.2

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy