![](/img/trans.png)
[英]serialize LocalDateTime to old format with Jackson Json mapper
[英]Serialize JsonNode to a very specific JSON format in Jackson
我有要打印的JsonNode
結果。 到目前為止,我正在使用:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
File outputFile = new File(
getCurOutputDir(), String.format("out.json", getClass().getSimpleName())
);
mapper.writeValue(new FileOutputStream(outputFile), resultNode);
輸出類似:
{
"A" : [ {
"Ai" : {
"Ai1" : 42,
"Ai2" : 55
}
} ],
"B" : [ 86 ]
}
但我需要采用以下特定格式:
{
"A" : [
{
"Ai" : {
"Ai1" : 42,
"Ai2" : 55
}
}
],
"B" : [
86
]
}
對於上下文,我正在從JSONObject
過渡到Jackson,因此第二個輸出是JSONObject.serialize()
輸出的輸出。
另外,上面列出的每種格式都有名稱嗎? 似乎它遵循不同的標准。
您可以自定義Jackson如何縮進輸出。 根據您使用的Jackson版本,有不同的實現方法。
請執行下列操作:
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);
默認情況下,將使用2個空格。 對於不同數量的空格,請使用DefaultIndenter
構造函數,該構造函數接收字符串來縮進級別和行分隔符:
Indenter indenter = new DefaultIndenter(" ", DefaultIndenter.SYS_LF);
請執行下列操作:
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);
Lf2SpacesIndenter
限制為2個空格,您不能更改它。
如果需要不同數量的空格,則需要編寫自定義實現。 這是使用與Jackson 2.5中引入的DefaultIndenter
相同的代碼的代碼:
/**
* 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 <code>indent</code> string to indent one level
* and the <code>eol</code> 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<INDENT_LEVELS; i++) {
indent.getChars(0, indent.length(), indents, offset);
offset += indent.length();
}
this.eol = eol;
}
public CustomSpaceIndenter withLinefeed(String lf) {
if (lf.equals(eol)) {
return this;
}
return new CustomSpaceIndenter(getIndent(), lf);
}
public CustomSpaceIndenter withIndent(String indent) {
if (indent.equals(getIndent())) {
return this;
}
return new CustomSpaceIndenter(indent, eol);
}
public String getEol() {
return eol;
}
public String getIndent() {
return new String(indents, 0, charsPerLevel);
}
@Override
public boolean isInline() {
return false;
}
@Override
public void writeIndentation(JsonGenerator jg, int level) throws IOException {
jg.writeRaw(eol);
if (level > 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);
}
}
}
可以如下使用:
Indenter indenter = new CustomSpaceIndenter(" ", CustomSpaceIndenter.SYS_LF);
您可以使用以下方法設置自定義DefaultPrettyPrinter
:
DefaultPrettyPrinter pp = new DefaultPrettyPrinter();
pp.indentObjectsWith(new Lf2SpacesIndenter());
pp.indentArraysWith(new Lf2SpacesIndenter("\r\n"));
mapper.writer(pp).writeValue(new FileOutputStream(outputFile), resultNode);
看一下DefaultPrettyPrinter
這里提供的方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.