2015-01-31 15 views
8

Sono davvero alle prese con il grado di complessità che sto percependo nel risolvere questo problema. Come dice il titolo: Che cos'è un modo semplice per creare un Jackson ObjectMapper con uno spazio 4 PrettyPrinter?Qual è il modo più semplice per configurare la spaziatura dell'indentazione su un ObjectMapper Jackson?

I punti bonus: Come posso modificarne uno esistenteObjectMapper per renderlo abbastanza stampa 4 spazi?

Attraverso la mia ricerca, ho trovato che il modo più semplice è quello di consentire la stampa in generale piuttosto è quello di impostare INDENT_OUTPUT sul mapper:

objectMapper.enable(SerializationFeature.INDENT_OUTPUT); 

Tuttavia, questo consente solo la la DefaultPrettyPrinter, che dispone di 2 posti di indentazione. Vorrei 4. Per fare questo, sembra che devo costruire il mio ObjectMapper, fornendo uno JsonFactory con uno JsonGenerator che ha uno PrettyPrinter che fa 4 spazi. Questo è troppo intenso per qualcosa che è così così semplice su altre piattaforme. Per favore dimmi che c'è un modo più semplice.

+0

Questo è un problema fresco. Semplicemente curioso, questo comportamento è desiderato per ragioni puramente estetiche o esiste effettivamente un vincolo da qualche parte che richiede l'utilizzo di 4 indentazioni spaziali? –

+0

Ho provato a mettere qualcosa di _real_ cattivo insieme al riflesso e ho deciso che probabilmente non è nemmeno divertente. Penso che l'idea sia alla base del clunkiness: è altrettanto goffo, non importa quanto complessa sia la tua configurazione. Probabilmente dovrai seguire il metodo prescritto da Jackson per applicarlo globalmente sul tuo mappatore esistente (sadpanda) –

+0

Ciao Sam. Grazie per aver pensato a questo. Immagino che il vincolo del caso d'uso per me sia estetico e pratico incontra lo zoppo: stavo cercando di registrare il contenuto di un grafico usando il modulo GraphSON fornito in Tinkerpop3. Debugging logging JSON è molto utile per me quando c'è un grosso indentation. Ecco la domanda originale: http://stackoverflow.com/questions/28255878/can-i-customize-a-jackson-objectmapper-by-adding-a-module –

risposta

9

Non sono sicuro se questa sia la più semplice, ma ... È possibile utilizzare ObjectMapper con una stampante personalizzata. È possibile utilizzare DefaultPrettyPrinter se si modifica il comportamento del rientro.

// Create the mapper 
ObjectMapper mapper = new ObjectMapper(); 

// Setup a pretty printer with an indenter (indenter has 4 spaces in this case) 
DefaultPrettyPrinter.Indenter indenter = 
     new DefaultIndenter(" ", DefaultIndenter.SYS_LF); 
DefaultPrettyPrinter printer = new DefaultPrettyPrinter(); 
printer.indentObjectsWith(indenter); 
printer.indentArraysWith(indenter); 

// Some object to serialize 
Map<String, Object> value = new HashMap<>(); 
value.put("foo", Arrays.asList("a", "b", "c")); 

// Serialize it using the custom printer 
String json = mapper.writer(printer).writeValueAsString(value); 

// Print it 
System.out.println(json); 

L'uscita sarà:

{ 
    "foo" : [ 
     "a", 
     "b", 
     "c" 
    ] 
} 
+0

Grazie. Mi erano mancati un paio di cose che lei indicava qui. –

+0

È possibile utilizzare 'mapper.setDefaultPrettyPrinter (stampante);' per rendere la stampante personalizzata in questa risposta quella predefinita per il mappatore oggetto. È ancora necessario abilitare il rientro tramite 'mapper.enable (SerializationFeature.INDENT_OUTPUT)'. – Towler

Problemi correlati