如何在 Java 中获得打印精美的 JSON 的紧凑/缩小形式?

问题描述 投票:0回答:4

如何使 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"]}}

我尝试删除 ' '、' ' 和 ' ' 字符;但值中可能有一些字符,所以我不能这样做。

还能做什么?

java json minify
4个回答
33
投票

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>

9
投票

通过流 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());

9
投票

安全的方法是使用 JsonNode API 读取数据,然后再次将其写出,而无需启用漂亮的打印机。

ObjectMapper m = new ObjectMapper();
JsonNode rootNode = m.readTree(payload);
String compressed = rootNode.toString();

如果对象很大,Streaming API 可以提供帮助。

如果您使用此模式,则使用正则表达式也可以工作:

\s*\n\s*

这不会创建最紧凑的形式(即元素之间仍然有一些空格),但如果您已经将 JSON 作为字符串,那么这是一个便宜的解决方案。这种模式安全的原因是新行在 String 值中无效(必须使用

\n
对其进行转义),因此您可以安全地删除它们周围的空格。


7
投票

Jackosn-core 是漂亮打印 json 的一种方法。您可以在这里阅读答案https://stackoverflow.com/a/12174201/432903

您还可以使用

org.json
库,这是一个非常简单但标准的java json库。此处开源代码 -> stleary/JSON-java

maven 依赖

<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."}

© www.soinside.com 2019 - 2024. All rights reserved.