lyomi
lyomi

Reputation: 4370

Jackson JSON Deserialization: array elements in each line

I am using Jackson and would like to pretty-print JSON such that each element in arrays goes to each line, like:

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

Setting SerializationFeature.INDENT_OUTPUT true only inserts newline characters for object fields, not array elements, printing the object in this way instead:

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

Does anyone know how to achieve this? Thanks!

Upvotes: 34

Views: 14278

Answers (6)

raisercostin
raisercostin

Reputation: 9189

Mapper can be configured (jackson-2.6) with:

ObjectMapper mapper = ...
DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
prettyPrinter.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);
mapper.setDefaultPrettyPrinter(prettyPrinter);

//use mapper 

Upvotes: 8

Stefan Haberl
Stefan Haberl

Reputation: 10539

If you don't want to extend DefaultPrettyPrinter you can also just set the indentArraysWith property externally:

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

DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
prettyPrinter.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);

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

Upvotes: 38

Cwt
Cwt

Reputation: 8576

The answer thankfully provided by OP shows a way for obtain a single-array-element-per-line formatted JSON String from writeValueAsString. Based on it here a solution to write the same formatted JSON directly to a file with writeValue with less code:

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);
}

Upvotes: 2

lyomi
lyomi

Reputation: 4370

Thanks to the helpful hints, I was able to configure my ObjectMapper with desired indentation as follows:

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);
}

Upvotes: 17

nutlike
nutlike

Reputation: 4975

You could extend the DefaultPrettyPrinter and override the methods beforeArrayValues(…) and writeArrayValueSeparator(…) to archieve the desired behaviour. Afterwards you have to add your new Implementation to your JsonGenerator via setPrettyPrinter(…).

Upvotes: 12

eppej
eppej

Reputation: 119

try out JSON Generator...

API Reference
good example

Upvotes: -1

Related Questions