2013-02-18 21 views
5

sto usando Jackson e vorrebbe pretty-print JSON tale che ogni elemento in array va a ogni riga, come:Jackson JSON deserializzazione: elementi dell'array in ogni linea

 
{ 
    "foo" : "bar", 
    "blah" : [ 
    1, 
    2, 
    3 
    ] 
} 

Impostazione SerializationFeature.INDENT_OUTPUT vero inserisce solo ritorno a capo caratteri per campi oggetto, non elementi array, stampando l'oggetto in questo modo:

 
{ 
    "foo" : "bar", 
    "blah" : [1, 2, 3] 
} 

Qualcuno sa come ottenere questo risultato? Grazie!

risposta

9

Si potrebbe estendere il DefaultPrettyPrinter e sovrascrivere i metodi beforeArrayValues ​​(...) e writeArrayValueSeparator (...) di raggiungere un 'il comportamento desiderato . Successivamente devi aggiungere la tua nuova implementazione al tuo JsonGenerator tramite setPrettyPrinter(…).

13

Grazie ai suggerimenti utili, sono stato in grado di configurare il mio ObjectMapper con rientro desiderata come segue:

private static class PrettyPrinter extends DefaultPrettyPrinter { 
    public static final PrettyPrinter instance = new PrettyPrinter(); 

    public PrettyPrinter() { 
     _arrayIndenter = Lf2SpacesIndenter.instance; 
    } 
} 

private static class Factory extends JsonFactory { 
    @Override 
    protected JsonGenerator _createGenerator(Writer out, IOContext ctxt) throws IOException { 
     return super._createGenerator(out, ctxt).setPrettyPrinter(PrettyPrinter.instance); 
    } 
} 

{ 
    ObjectMapper mapper = new ObjectMapper(new Factory()); 
    mapper.configure(SerializationFeature.INDENT_OUTPUT, true); 
} 
+0

Grazie per aver condiviso la tua soluzione. +1 – nutlike

1

Il answer fortunatamente fornito da OP mostra un modo per ottenere un singolo nell'edificio- element-per-line formattato JSON String da writeValueAsString. Sulla base di qui una soluzione per scrivere la stessa JSON formattato direttamente in un file con writeValue con meno codice:

private static class PrettyPrinter extends DefaultPrettyPrinter { 
    public static final PrettyPrinter instance = new PrettyPrinter(); 

    public PrettyPrinter() { 
     _arrayIndenter = Lf2SpacesIndenter.instance; 
    } 
} 

{ 
    ObjectMapper mapper = new ObjectMapper(); 
    ObjectWriter writer = mapper.writer(PrettyPrinter.instance); 
    writer.writeValue(destFile, objectToSerialize); 
} 
1

Se non si desidera estendere DefaultPrettyPrinter si può anche solo impostare la proprietà indentArraysWith esternamente:

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.enable(SerializationFeature.INDENT_OUTPUT); 

DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter(); 
prettyPrinter.indentArraysWith(DefaultPrettyPrinter.Lf2SpacesIndenter.instance); 

String json = objectMapper.writer(prettyPrinter).writeValueAsString(object); 
Problemi correlati