2013-02-18 3 views
5

Я использую Jackson и хотел бы довольно-печать в формате JSON, так что каждый элемент в массивах идет в каждую строку, например:Джексон JSON Десериализация: элементы массива в каждой строке

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

Установка SerializationFeature.INDENT_OUTPUT истинных только вставляет символ новой строки символы для полей объектов, а не элементы массива, вместо этого напечатайте объект следующим образом:

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

Кто-нибудь знает, как достичь этого? Благодаря!

ответ

9

Вы можете расширить DefaultPrettyPrinter и переопределить методы beforeArrayValues ​​(...) и writeArrayValueSeparator (...) в АРХИВ желаемого поведения , После этого вы должны добавить свою новую реализацию в свой JsonGenerator через setPrettyPrinter(…).

13

Благодаря полезные подсказки, я был в состоянии настроить мой ObjectMapper с желаемым отступа следующим образом:

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

Благодарим за обменное решение. +1 – nutlike

1

answer к счастью обеспечивается OP показывает способ для получения одного-array- форматированный элемент в строке JSON String от writeValueAsString. Исходя из этого здесь решения, чтобы написать тот же отформатированный JSON непосредственно в файл с writeValue с меньшим количеством коды:

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

Если вы не хотите расширить DefaultPrettyPrinter вы также можете просто установить indentArraysWith свойства внешне:

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); 
Смежные вопросы