À l'heure actuelle, j'ai une instance de org.fasterxml.jackson.databind.ObjectMapper
et j'aimerais obtenir une String
avec un joli JSON. Tous les résultats de mes recherches sur Google ont abouti à des solutions Jackson 1.x et je n'arrive pas à trouver le moyen approprié et non déprécié de procéder de la sorte avec 2.2. Même si je ne crois pas que le 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
Vous pouvez activer l'impression en définissant le SerializationFeature.INDENT_OUTPUT
sur votre ObjectMapper
comme suit:
mapper.enable(SerializationFeature.INDENT_OUTPUT);
Selon mkyong , l'incantation magique est defaultPrintingWriter
à jolie impression JSON :
Nouvelles versions:
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonInstance));
Versions plus anciennes:
System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonInstance));
On dirait que j'ai sauté un peu trop vite dans l'arme. Vous pouvez essayer gson , dont le constructeur prend en charge l’impression jolie :
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);
J'espère que cela t'aides...
L'API jackson a changé:
new ObjectMapper()
.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(new HashMap<String, Object>());
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 ) );
}
si vous utilisez une combinaison printemps/jackson, vous pouvez le faire comme suit. Je suis @gregwhitaker comme suggéré mais en appliquant le style printanier.
<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>
Si vous souhaitez l'activer par défaut pour TOUTES les instances d'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)