Jackson:如何改变JSON输出中冒号的缩进?



我有JSON输出,在冒号左侧有1个空格。我需要去掉左边的空白

下面是我的输出。下面是生成它的代码。

我需要保留输出中的其他内容,所以我无法摆脱漂亮的打印或缩进大括号。

[
{
"satelliteId" : 1000,
"severity" : "RED HIGH",
"component" : "TSTAT",
"timestamp" : "2018-01-01T23:01:38.001Z"
},
{
"satelliteId" : 1000,
"severity" : "RED LOW",
"component" : "BATT",
"timestamp" : "2018-01-01T23:01:09.521Z"
}
]

代码:

import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.util.DefaultIndenter;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class FormatAlerts {
List<Message> alerts = new ArrayList<>();
public FormatAlerts(List<Message>alerts){
this.alerts = alerts;
}
public String formatAlerts(){
String formattedAlerts = null;
ObjectMapper om = new ObjectMapper();
ArrayNode arrayNode = om.createArrayNode();
// Create a "Pretty Printer" that will indent brackets and braces more
String indent = String.format("%-4s","");
DefaultPrettyPrinter.Indenter indenter = new DefaultIndenter(indent, DefaultIndenter.SYS_LF);
DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
printer.indentObjectsWith(indenter);
printer.indentArraysWith(indenter);

try {
for (Message m : alerts) {
// Format the time 
Instant t = Instant.ofEpochMilli(m.getEpochTime());
m.setTimestamp(t.toString());
//Format the alert as Json
String alert = om.writer(printer).writeValueAsString(m);
//String alert = om.writerWithDefaultPrettyPrinter().writeValueAsString(m);
ObjectNode obj = om.readValue(alert, ObjectNode.class);          
arrayNode.add(obj);
formattedAlerts = om.writer(printer).writeValueAsString(arrayNode);
//formattedAlerts = om.writerWithDefaultPrettyPrinter().writeValueAsString(arrayNode);
}
} catch (JsonProcessingException jpe) {
jpe.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return formattedAlerts;
}
}

可能有更好的方法,但是您可以创建自己的漂亮的打印机类,使用不同的分隔符:

DefaultPrettyPrinter printer = new DefaultPrettyPrinter() {
@Override
public DefaultPrettyPrinter createInstance() {
return new DefaultPrettyPrinter(this);
}
@Override
public DefaultPrettyPrinter withSeparators(Separators separators) {
_separators = separators;
_objectFieldValueSeparatorWithSpaces = separators.getObjectFieldValueSeparator() + " ";
return this;
}
};
printer = printer.withSeparators(Separators.createDefaultInstance());

_objectFieldValueSeparatorWithSpaces中的值替换为": ",而不是通常的" : "

createInstance返回的打印机将永远不会被使用,但是createInstance仍然需要被覆盖。

最新更新