如何获得漂亮打印的JSON代码的紧凑形式?

2022-09-01 17:10:03

如何使 Jackson 的 build() 方法漂亮地打印其 JSON 输出?下面是一个漂亮打印出丑陋形式的 JSON 代码的示例。我需要采用JSON代码的漂亮版本,然后将其伪装成丑陋的fom。如何做到这一点?我需要转换这个:

 {
   "one" : "AAA",
   "two" : [ "BBB", "CCC" ],
   "three" : {
     "four" : "DDD",
     "five" : [ "EEE", "FFF" ]
   }
 }

对此:

{"one":"AAA","two":["BBB","CCC"],"three":{"four":"DDD","five":["EEE","FFF"]}}

我试图删除“\n”,“\t”和“”字符;但是值中可能有一些这样的字符,所以我不能这样做。还能做些什么?


答案 1

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>

答案 2

使用流式处理 API,您可以使用 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());