2013-02-18 10 views
5

używam Jackson i chcieliby całkiem-print JSON tak, że każdy element macierzy idzie do każdej linii, jak:Jackson JSON deserializacji: elementy tablicy w każdej linii

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

Ustawianie SerializationFeature.INDENT_OUTPUT prawdziwe tylko wstawia znak nowej linii znaków dla pól obiektów, a nie elementów tablicowych, zamiast tego drukować obiekt:

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

Czy ktoś wie, jak to osiągnąć? Dzięki!

Odpowiedz

9

Można przedłużyć DefaultPrettyPrinter i nadpisać Metody beforeArrayValues ​​(...) i writeArrayValueSeparator (...) do Archiwum pożądane zachowanie . Następnie musisz dodać nową implementację do JsonGenerator poprzez setPrettyPrinter(…).

13

Dzięki pomocnych wskazówek, udało mi się skonfigurować mój ObjectMapper z żądanym wcięcia następująco:

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

Dziękujemy za udostępnienie rozwiązania. +1 – nutlike

1

answer szczęście dostarczone przez PO pokazuje drogę do otrzymania jednorazowego array- JSON String sformatowany w systemie JSON od writeValueAsString. W oparciu o nią tu rozwiązania napisać tę samą sformatowaną JSON bezpośrednio do pliku z writeValue mniej kodu:

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

Jeśli nie chcesz przedłużyć DefaultPrettyPrinter można też po prostu ustawić właściwość indentArraysWith zewnętrznie:

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); 
Powiązane problemy