Jolie impression JSON depuis ObjectMapper de Jackson 2.2


141

En ce moment, j'ai une instance de org.fasterxml.jackson.databind.ObjectMapperet je voudrais obtenir un Stringjoli JSON. Tous les résultats de mes recherches sur Google ont abouti à des moyens Jackson 1.x de le faire et je n'arrive pas à trouver le moyen approprié et non obsolète de le faire avec la version 2.2. Même si je ne pense pas que ce code soit absolument nécessaire pour cette question, voici ce que j'ai en ce moment:

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

Réponses:


277

Vous pouvez activer la jolie impression en définissant SerializationFeature.INDENT_OUTPUTsur votre ObjectMappercomme ainsi:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
J'ai également essayé cela, mais il semble que ce SerializationConfigsoit résolu, mais ce SerializationConfig.Featuren'est pas le cas. Cela semble être une autre méthode d'impression jolie qui est également déconseillée, sauf si je manque quelque chose. Il y a une Featureclasse qui est séparée d'elle-même, mais qui n'a pas de INDENT_OUTPUTconstante à l'intérieur. :(
Anthony Atkinson

Excellent! J'aimerais savoir comment vous avez trouvé ça;)
Anthony Atkinson

1
J'ai regardé un de mes projets, mais il semble qu'il soit aussi ici: github.com/FasterXML/jackson-databind sous "Fonctionnalités couramment utilisées"
gregwhitaker

L'importation pertinente nécessaire est import com.fasterxml.jackson.databind. {SerializationFeature, ObjectMapper}
dgh

2
sur 2.2.1, voici ce qu'il a fallu pour moi: import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable (Feature.INDENT_OUTPUT);
harschware

46

Selon mkyong , l'incantation magique est defaultPrintingWriterd' imprimer JSON :

Versions plus récentes:

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

Versions plus anciennes:

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

Il semble que j'ai sauté le pistolet un peu rapidement. Vous pouvez essayer gson , dont le constructeur prend en charge la jolie impression :

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

J'espère que cela t'aides...


1
J'ai trouvé cet article et j'ai été déçu de constater que c'est l'une de ces méthodes obsolètes de jolie impression. defaultPrettyPrintingWriter()n'est plus disponible (même en tant que méthode obsolète) sur la ObjectMapperclasse.
Anthony Atkinson

J'y pensais en fait, mais mon application est déjà fortement orientée Jackson et toutes les fonctionnalités sont en fait complètes. Le serveur d'applications Web sur lequel cela sera hébergé est déjà très lourdement taxé, et je ne voudrais pas charger des bibliothèques supplémentaires simplement pour enregistrer les demandes et les réponses. Je voterai certainement votre réponse.
Anthony Atkinson

7
@AnthonyAtkinson dans Jackson 2.3 il y a une méthodeObjectMapper.writerWithDefaultPrettyPrinter()
matt b

36

L'API jackson a changé:

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

3
Il est toujours possible (avec Jackson 2.7.6) d'utiliser new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());. Vous devez simplement vous assurer d'utiliser le graveur que vous obtenez à partir du fichier configuré ObjectMapper.
Martin

3

l'IDENT_OUTPUT n'a rien fait pour moi, et pour donner une réponse complète qui fonctionne avec mes jars 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 ) );
}

0

Si vous souhaitez l'activer par défaut pour TOUTES les instances ObjectMapper d'un processus, voici un petit hack qui définira la valeur par défaut de INDENT_OUTPUT sur true:

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

0

si vous utilisez une combinaison ressort et jackson, vous pouvez le faire comme suit. Je suis @gregwhitaker comme suggéré, mais je l'implémente au printemps.

<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

Si d'autres personnes qui consultent cette question n'ont qu'une chaîne JSON (pas dans un objet), vous pouvez la mettre dans un HashMapet toujours faire ObjectMapperfonctionner le. La resultvariable est votre chaîne 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();
} 

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.