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
Anthony Atkinson
la source

Réponses:

277

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

mapper.enable(SerializationFeature.INDENT_OUTPUT);
Gregwhitaker
la source
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...

hd1
la source
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>());
Rian
la source
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 ) );
}
Stan Towianski
la source
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)
Graham Lea
la source
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>
MohanaRao SV
la source
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();
} 
Azurespot
la source
-8

Essaye ça.

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
se sentir bien et programmation
la source
13
Dupliquer la réponse choisie après 7 mois n'est pas vraiment utile.
Igor Rodriguez
1
pourrait être utile à quelqu'un comme je l'ai mentionné dans une ligne, je me sens bien en partageant tout ce que je sais.
feel good et programmation du