如何使 Jackson 的 build() 方法漂亮地打印其 JSON 输出? 是一个漂亮地打印 JSON 字符串的示例。
我需要获取 JSON 字符串的打印精美版本,然后将其转换为紧凑/缩小的形式。怎么办?
我需要转换这个:
{
"one" : "AAA",
"two" : [ "B B", "CCC" ],
"three" : {
"four" : "D D",
"five" : [ "EEE", "FFF" ]
}
}
对此:
{"one":"AAA","two":["B B","CCC"],"three":{"four":"D D","five":["EEE","FFF"]}}
我尝试删除 ' '、' ' 和 ' ' 字符;但值中可能有一些字符,所以我不能这样做。
还能做什么?
Jackson 允许您读取 JSON 字符串,因此将漂亮打印的字符串读回到 Jackson 中,然后在禁用漂亮打印的情况下再次输出它。
请参阅将字符串转换为 JSON。
String prettyJsonString = "{ \"Hello\" : \"world\"}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readValue(prettyJsonString, JsonNode.class);
System.out.println(jsonNode.toString());
需要
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
JsonGenerator.copyCurrentEvent()
轻松地重新输出令牌流,并应用您想要的任何漂亮打印,包括默认的无空格;这可以避免在内存中缓冲整个文档并为文档构建树。
// source and out can be streams, readers/writers, etc.
String source = " { \"hello\" : \" world \" } ";
StringWriter out = new StringWriter();
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(source);
try (JsonGenerator gen = factory.createGenerator(out)) {
while (parser.nextToken() != null) {
gen.copyCurrentEvent(parser);
}
}
System.out.println(out.getBuffer().toString()); // {"hello":" world "}
您可以使用相同的方法以流式传输方式漂亮地打印 JSON 文档:
// reindent
gen.setPrettyPrinter(new DefaultPrettyPrinter());
安全的方法是使用 JsonNode API 读取数据,然后再次将其写出,而无需启用漂亮的打印机。
ObjectMapper m = new ObjectMapper();
JsonNode rootNode = m.readTree(payload);
String compressed = rootNode.toString();
如果对象很大,Streaming API 可以提供帮助。
如果您使用此模式,则使用正则表达式也可以工作:
\s*\n\s*
这不会创建最紧凑的形式(即元素之间仍然有一些空格),但如果您已经将 JSON 作为字符串,那么这是一个便宜的解决方案。这种模式安全的原因是新行在 String 值中无效(必须使用
\n
对其进行转义),因此您可以安全地删除它们周围的空格。
Jackosn-core 是漂亮打印 json 的一种方法。您可以在这里阅读答案https://stackoverflow.com/a/12174201/432903
您还可以使用
org.json
库,这是一个非常简单但标准的java json库。此处开源代码 -> stleary/JSON-java。
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
String payload = "{\n" +
" \"fact1\": \"Java is verbose.\", \n" +
" \"fact2\" : \"C has pointers\"\n" +
"}";
System.out.println(new JSONObject(payload));
您将在一行中获得紧凑的 json
{"fact2":"C has pointers","fact1":"Java is verbose."}
。