web-dev-qa-db-fra.com

Jolie impression JSON de ObjectMapper de Jackson 2.2

À 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
123
Anthony Atkinson

Vous pouvez activer l'impression en définissant le SerializationFeature.INDENT_OUTPUT sur votre ObjectMapper comme suit:

mapper.enable(SerializationFeature.INDENT_OUTPUT);
241
gregwhitaker

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

42
hd1

L'API jackson a changé:

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

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 ) );
}
3
Stan Towianski

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

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)
0
Graham Lea