Bella stampa JSON dall'ObjectMapper di Jackson 2.2


141

In questo momento ho un'istanza di org.fasterxml.jackson.databind.ObjectMappere vorrei ottenere un Stringbel JSON. Tutti i risultati delle mie ricerche su Google hanno prodotto Jackson 1.x modi per farlo e non riesco a trovare il modo corretto e non deprecato di farlo con 2.2. Anche se non credo che il codice sia assolutamente necessario per questa domanda, ecco cosa ho adesso:

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

Risposte:


277

Puoi abilitare pretty-printing impostando il SerializationFeature.INDENT_OUTPUTtuo ObjectMapperlike così:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
Ho anche provato questo, ma sembra che SerializationConfigsia stato risolto ma SerializationConfig.Featurenon lo è. Questo sembra essere un altro metodo di stampa carina che è anche deprecato a meno che non mi manchi qualcosa. C'è una Featureclasse che è separata da sola, ma non ha una INDENT_OUTPUTcostante all'interno. :(
Anthony Atkinson,

Eccellente! Mi piacerebbe sapere come l'hai trovato;)
Anthony Atkinson,

1
Ho guardato uno dei miei progetti, ma sembra che sia anche qui: github.com/FasterXML/jackson-databind in "Funzionalità comunemente utilizzate"
gregwhitaker,

L'importazione necessaria è l'importazione com.fasterxml.jackson.databind. {SerializationFeature, ObjectMapper}
dgh

2
su 2.2.1 questo è quello che ci è voluto per me: import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable (Feature.INDENT_OUTPUT);
harschware,

46

Secondo mkyong , l'incantesimo magico è defaultPrintingWriterper stampare abbastanza JSON :

Versioni più recenti:

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

Versioni precedenti:

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

Sembra che ho saltato un po 'la pistola rapidamente. Potresti provare gson , il cui costruttore supporta pretty-printing :

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

Spero che questo ti aiuti...


1
Ho trovato questo articolo e sono rimasto deluso nel constatare che questo è uno di quei modi deprecati di stampare in modo carino. defaultPrettyPrintingWriter()non è più disponibile (anche come metodo obsoleto) sulla ObjectMapperclasse.
Anthony Atkinson,

In realtà stavo pensando di farlo, ma la mia applicazione è già fortemente orientata a Jackson e tutte le funzionalità sono effettivamente complete. Il server di applicazioni Web su cui verrà ospitato questo è già tassato abbastanza pesantemente e non vorrei caricare librerie extra semplicemente per la registrazione di richieste e risposte. Sicuramente voterò la tua risposta, comunque.
Anthony Atkinson,

7
@AnthonyAtkinson a Jackson 2.3 c'è un metodoObjectMapper.writerWithDefaultPrettyPrinter()
matt b

36

L'API jackson è cambiata:

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

3
È ancora possibile (con Jackson 2.7.6) da usare new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());. Devi solo assicurarti di usare lo scrittore che ottieni dal configurato ObjectMapper.
Martin,

3

IDENT_OUTPUT non ha fatto nulla per me e per dare una risposta completa che funziona con i miei vasetti 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

Se desideri attivarlo per impostazione predefinita per TUTTE le istanze di ObjectMapper in un processo, ecco un piccolo trucco che imposta il valore predefinito di INDENT_OUTPUT su true:

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

0

se stai usando la combinazione primavera e jackson puoi farlo come segue. Sto seguendo @gregwhitaker come suggerito ma implementando in stile primavera.

<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

Se altri utenti che visualizzano questa domanda hanno solo una stringa JSON (non in un oggetto), puoi inserirla in a HashMape continuare a farlo ObjectMapperfunzionare. La resultvariabile è la tua stringa 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();
} 

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.