I have JsonNode result that I want to print out. So far, I am using:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeatur
You can customize how Jackson will indent the output. There are different ways to achieve it, according to the Jackson version you are using.
Do the following:
DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
Indenter indenter = new DefaultIndenter();
printer.indentObjectsWith(indenter); // Indent JSON objects
printer.indentArraysWith(indenter); // Indent JSON arrays
ObjectMapper mapper = new ObjectMapper();
mapper.writer(printer).writeValue(new FileOutputStream(outputFile), node);
By default, 2 spaces will be used. For a different number of spaces, use the DefaultIndenter constructor that receives a string to indent levels and the line separator:
Indenter indenter = new DefaultIndenter(" ", DefaultIndenter.SYS_LF);
Do the following:
DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
Indenter indenter = new Lf2SpacesIndenter();
printer.indentObjectsWith(indenter); // Indent JSON objects
printer.indentArraysWith(indenter); // Indent JSON arrays
ObjectMapper mapper = new ObjectMapper();
mapper.writer(printer).writeValue(new FileOutputStream(outputFile), node);
The Lf2SpacesIndenter is limited to 2 spaces and you cannot change it.
If you need a different number of spaces, you need to write your custom implementation. Here's one that uses the same code as the DefaultIndenter introduced in Jackson 2.5:
/**
* Default linefeed-based indenter.
*/
public class CustomSpaceIndenter extends DefaultPrettyPrinter.NopIndenter {
public final static String SYS_LF;
static {
String lf;
try {
lf = System.getProperty("line.separator");
} catch (Throwable t) {
lf = "\n"; // fallback when security manager denies access
}
SYS_LF = lf;
}
public static final CustomSpaceIndenter SYSTEM_LINEFEED_INSTANCE =
new CustomSpaceIndenter(" ", SYS_LF);
/**
* We expect to rarely get indentation deeper than this number of levels,
* and try not to pre-generate more indentations than needed.
*/
private final static int INDENT_LEVELS = 16;
private final char[] indents;
private final int charsPerLevel;
private final String eol;
/**
* Indent with two spaces and the system's default line feed
*/
public CustomSpaceIndenter() {
this(" ", SYS_LF);
}
/**
* Create an indenter which uses the indent string to indent one level
* and the eol string to separate lines.
*/
public CustomSpaceIndenter(String indent, String eol) {
charsPerLevel = indent.length();
indents = new char[indent.length() * INDENT_LEVELS];
int offset = 0;
for (int i=0; i 0) { // should we err on negative values (as there's some flaw?)
level *= charsPerLevel;
while (level > indents.length) { // unlike to happen but just in case
jg.writeRaw(indents, 0, indents.length);
level -= indents.length;
}
jg.writeRaw(indents, 0, level);
}
}
}
It can be used as following:
Indenter indenter = new CustomSpaceIndenter(" ", CustomSpaceIndenter.SYS_LF);